视图控制器----故事板



使用故事板


     一个故事板指定了一个视图控制器作为初始视图控制器。如果描述了UI中一个特定的工作流,故事板的初始视图控制器就是工作流中的第一个场景的视图控制器。
     要构成工作流,需要为初始视图控制器指定到其他视图控制器的关系。转换关系在要转到的视图控制器对象被实例化时建立:
1.如果是延续关系,则延续被触发时目标视图控制器实例化
2.如果是包含关系,子控制器在父控制器实例化时实例化
3.如果不是延续或包含,就不会自动创建目标视图控制器。需要在故事板的关联代码中手动创建。




     要确定故事板中的视图控制器或延续,需要使用IB来指定一个特殊的识别字串。要手动从故事板中加载一个视图控制器,需要一个识别字串。同样,要手动触发一个延续,也必须有一个识别字串。当一个延续被触发时,延续的识别字串发送给源视图控制器,用于确定哪个延续被触发了。因此,需要为每个延续添加一个识别字串。


     当构建app时,可以使用一个故事板管理所有视图控制器,可以建立多个故事板,每个完成应用的一部分。应用会自动加载main 故事板,其他的必须显示加载。



主故事板初始化了应用的用户界面


     主故事板在应用的property list文件中定义。当指定了主故事板后,应用加载时会做三件事:
1.初始化一个window
2.加载主故事板,并初始化指定视图控制器
3.把window的rootViewController属性设置为指定视图控制器,然后显示window

精准步骤见:Coordinating Efforts Between View Controllers



延续(segue)自动初始化目标视图控制器


     延续描述了一个被触发的转换,用于推出新的视图控制器。延续包含了转换的许多信息,包含:
1.引发延续的对象-- sender
2.开启延续的视图控制器
3.将要实例化的目标视图控制器
4.转换的种类
5.延续的识别字串。

当延续触发时有以下动作:
1.使用在故事板中设置的属性值实例化目标视图控制器
2.给源视图控制器一个配置新视图控制器的机会
3.执行延续中配置的转换

note:当自定义视图控制器时,每个目标视图控制器声明了公有的属性和方法,用于源视图控制器配置其表现。同时,定制的原始图控制器通过重写故事板方法配置目的视图控制器。



手动触发延续


     延续一般是由原始图控制器上的控制控件或者手势识别事件触发的。延续也可以被应用手动触发,仅当延续有识别字串时。

     通过performSegueWithIdentifier:sender:方法手动触发延续,使用识别字串。当原控制器被调用配置目标视图控制器时,sender以及识别字串都被延续捕获。



手动实例化故事板的视图控制器


     有时候需要手动实例化视图控制器,而不是使用延续。故事板仍然是有用的,因为可以通过故事板配置视图控制器的属性及视图层次。然而,不使用延续的话,不会获得延续的表现。得为推出视图控制器写代码。最好还是用延续,可以省事。


     手动实现的步骤:


1.包含一个故事板对象。
     如果有一个已经存在的故事板管理的视图控制器,可以通过storyboard属性获得故事板。要加载另一个故事板的话,通过故事板的storyboardWithName:bundle:类方法,使用故事板文件的名字和可选bundle参数实现。
2.使用故事板的instantiateViewControllerWithIdentifier:方法,传入IB中设置的视图控制器的识别字串来初始化。也可以使用instantiateInitialViewController方法从故事板实例化视图控制器,不用识别字串。
3.配置新的视图控制器的属性。

4.推出视图控制器。



跳到新的故事板需要用代码实现


     延续仅仅能连接在同一个故事板中的场景。要显示另一个故事板中的视图控制器,需要显式加载那个故事板和它的指定视图控制器。创建多故事板并不是必须的,多故事板有用的场景有:

1.需要团队开发应用时,每个小团队有一个故事板开发。


2.有一个预定义了许多视图控制器的类库;视图控制器的内容在一个一个的故事板上实现。


3.需要在另外的屏幕上显示内容。这种情况,需要在另一个屏幕的故事板上实现一个视图层次。这种情况也可以通过自定义延续实现。



容器自动实例化它们的子对象


     当一个在故事板上的容器被实例化时,它的子对象同时被实例化。同理,如果子对象也是一个容器,它的子对象也会被实例化。如果在一个tab bar上放了一个navigation控制器上有个容器控制器,这三个对象会被同时实例化。
     容器中的内容及其子内容将在其视图控制器之前实例化。源视图控制器可以依赖被实例化的子视图控制器。这个实例化表现很重要,因为视图控制器经常需要配置其内容。

 


你可能感兴趣的:(ios)