如何安全地尝试在 Swift 中执行 segue 而 ignoring/handling 手动可能的异常?

How to safely try to perform segue in Swift while ignoring/handling manually possible exceptions?

我正在尝试制作一个在我的项目中使用的自定义视图控制器,它可能有 3 个 segues。但这些都不是强制性的。 当视图控制器加载时,我正在调用一个方法“trySegues()”,它应该尝试执行所有 3 个 segues。 Segues 是自定义的,因此每个成功的调用都将在我的代码中处理和注册。

在 Objective-C 中,我会使用“@try - @catch”来执行此操作,因此所有成功的调用都将继续进行,而如果未设置其中一个 segues,它'我会抛出一个异常,但它会由我手动处理,所以它不会中断程序的执行。

有没有办法在 Swift 中做同样的事情? 使用 Optionals 来模拟异常是行不通的,因为 performSegueWithIdentifier 函数 returns 没有值。

@try-@catch-ing performSegueWithIdentifier: 是应对这一挑战的合适方法。不在 Objective-C 中。不在 Swift.

Segues 不能(或不应该)独立于故事板而存在。毕竟,如果您尝试实例化一个 segue,class 名称是 UIStoryboardSegue。这个 class 甚至存在 publicly 的事实并不是你可以实例化它并在 运行 时添加它。它的存在使您可以子class 转场,在故事板上选择您的子class,并设置具有自定义行为的转场:

在Objective-C和Swift中,异常是为真正异常的行为保留的。可以在 开发 时间阻止的行为。在我们发布应用程序时,我们不应该在 运行 时间内依赖 @try-@catch 块。我们应该修复我们的应用程序,这样 @catch.

就没什么了

因此,performSegueWithIdentifier: 抛出异常的唯一方法是如果我们给它的 segue 标识符不存在。 segue 不应该存在的唯一原因是我们在某处打错了字。

segues 在编译时连接和定义。没有 public 检查特定转场是否存在的机制,因为我们根本不应该这样做。


现在,综上所述,如果我们想在 运行 时动态推送或模态呈现特定的视图控制器,并且我们无法在编译时知道它将是什么视图控制器(或我们从哪个视图控制器获取它),那么我们不应该通过 segue 呈现它。

相反,我们应该使用 UIViewController class 定义的显示选项之一。

您的选择是:

  • presentViewController(_:animated:completion:)
  • showViewController(_:sender:)
  • showDetailViewController(_:sender:)

代替放松转场,您需要这样的东西:

  • dismissViewControllerAnimated(_:completion:)