如何在Xcode 8中更好地使用StoryBoard

苹果在Xcode 8中为 Interface Builder 的界面做了非常伟大的改善,Size Classes 变得更加直观,StoryBoard的使用也变得更加的便利,还有一个完整度惊人的 Interface Builder 预览界面,这对于那些对 interface Builder 的使用犹豫不决的人来说, 可能成为巨大的冲击。

在另一方面, 许多开发者在使用Interface Builder的时候仍然有一些麻烦, 尤其是在构建一个巨大的包含复杂导航的多屏幕应用的时候。

在这篇文章里, 我将分享给你一些处理项目里面的 StroyBoards 和 Nibs 的好建议,如果你还没有用过Interface Builder, 或者你正打算使用这个工具,那么这些建议可能对你很有用。

1. 如果是团队协作开发, 请为每一个屏幕使用一个单独的 StoryBoard,如果你是独立工作, 这依旧是一个好的习惯。

你在项目里是不是有一个类似于这样的main.storyboard?

但是这对于开发者来说, 就可能会存在很多问题:


源码控制: StoryBoard 非常难解决合并时候产生的冲突, 所以单独的StoryBoard会使你在团队工作中变得更加轻松。

StoryBoard文件会变得非常臃肿和难以驾驭,你有多少次因为点错而无意中改变了ViewController的约束?

你需要为每一个ViewController分配一个StoryBoard的ID, 这非常容易出错: 因为你每次使用这个veiwcontroller的时候都要硬编码这个ID。

如何连接项目里面的不同的StoryBoard? 这里有两种方法:


使用Xcode7中所提供的StoryBoard Reference方案

通过代码来连接StoryBoard

你可以点击这里来阅读关于第一种方法的更多的内容。


我将要介绍第二种方法, 因为它在复杂的项目中非常的常见。


2. StoryBoard文件与相关的ViewController subclass使用相同的名称。


这将简化命名的约定, 并且提供给你一些与第三条建议相关的好处。

 在UIViewController subclass中初始化StoryBoard.


在初始化StoryBoard的Base ViewController的代码中, 我经常看到下面这样的代码:

let storyboard = UIStoryboard(name: “Main”, bundle: nil)

let homeViewController = storyboard.instantiateViewController(withIdentifier: “HomeViewController”)

这看起来一点都不清晰: 你需要知道这个StoryBoard的名字, 还需要提供这个ViewController在StoryBoard中的ID, 而且你在创建HomeViewController时, 每次都要使用这种方式。


这有一个更好的方式让你用代码在ViewController中使用类方法来初始化它和它所在的StoryBoard:


1

2

3

4

5

6

7

8

class HomeViewController: UIViewController {

     static func storyboardInstance() -> HomeViewController? { 

         let storyboard = UIStoryboard(name: String.className(self), 

                                       bundle: nil) return 

         storyboard.instantiateInitialViewController() as?   

                                                 HomeViewController 

     }

}

如果你按照之前的建议来操作, 你就可以避免硬编码 StoryBoard 的名称和实体类的名称.


1

let StoryBoard = UIStoryBoard(name: String.className(self), bundle: nil)

确保你的StoryBoard的名称和实体类的名称完全相同,否则,当视图引用这个StoryBoard时, 应用程序会崩溃.


这使你代码的可读性更高, 而且可以降低出错率:


class HomeViewController: UIViewController {

     static func StoryBoardInstance() -> HomeViewController? { 

         let StoryBoard = UIStoryBoard(name: String.className(self), 

                                       bundle: nil) return 

         StoryBoard.instantiateInitialViewController() as?   

                                                 HomeViewController 

     }

}

如果你想通过 instantiateInitialViewController()来访问ViewController, 请确保你在Interface Builder中设置这个ViewController为initialViewController . 如果你在相同的StoryBoard中有多个ViewController, 那么你需要使用instantiateViewController(withIdentifier: _ )

初始化这个ViewController的时候仅需要这一句代码:

let homeViewController = HomeViewController.StoryBoardInstance(


上一篇: 如何加快XCode编译速度?

下一篇: iOS开发进阶 - 项目的本地化处理(多语言开发)

分享到: 更多