情节提要技巧

今天在浏览另一个示例项目时,我再次注意到与故事板相关的大多数代码伴随着多少字符串文字和强制向下转换。

意识到这一点之后,我决定分享一些实践,使自己的视图控制器和情节提要处理代码更加自觉。

实例化视图控制器

让我们从实例化过程开始:我们依靠文件名来创建UIStoryboard实例,然后使用视图控制器标识符来调用instantiateViewController(withIdentifier:) ,所有这些混乱之后都是强制向下转换为实际类型。

View Controller实例化代码应该更加简洁,这是我要查找的示例:

为此,我们必须避免使用“大量故事板”模式,并将每个流保存在单独的文件中。 完成后,我们可以建立简单的约定,从而使我们可以将所有UIStoryboard内容隐藏在辅助函数中:

  • 仅从代码实例化初始视图控制器。
  • 通过segue访问同一情节提要中的所有其他视图控制器。
  • 使用初始视图控制器类名称来命名相应的情节提要。 对于老式的NIB来说,这是显而易见的,但我们倾向于不将模式与情节提要一起使用。

建立约定后,我们可以轻松地实例化任何仅赋予其类的视图控制器,其他所有内容均以编程方式派生。 辅助功能代码应类似于以下代码段:

我想在这里指出两个棘手的时刻:

  • 我们使用Bundle(for: self)代替nilBundle.main从动态框架正确加载资源。
  • 那个怪异的dynamicCast(_:as:)函数帮助我们解决Swift限制,该限制禁止我们将initialViewController as? Self编写initialViewController as? Self initialViewController as? Self 。 执行前者会导致编译错误,指出“ Self仅在协议中可用或作为类中方法的结果可用”。

处理问题

使用情节提要板时查找字符串标识符的另一个受欢迎的地方是prepare(for:sender:)方法。 在这里,我们测试segue标识符和与此相关的向下视图控制器。 像这样:

该代码片段同时采用了两种不良做法:容易出错的字符串标识符比较,然后强制向下转换。

在我看来,在大多数情况下唯一重要的事情是目标视图控制器类型。 在这些情况下,我们可以简单地switch可能的目的地,并fatalError 。 以下代码段显示了它在您的代码中的外观:


感谢您的阅读,希望您在我的帖子中找到了有用的东西。