对于WatchKit App,是可以在Storyboard里建立多个InterfaceController并像在iOS应用一样直观的画出视图转换连接的,当然我们也可以通过视图控制器代码实现相应视图切换与跳转。
简单来说视图转换连接有三种形式:
1.Push/Pop - 提供Hierarchical形态下基于栈(Stack)的视图控制,Hierarchical意为分级视图架构,效果类似iOS应用里的Navigation界面,主要用于导航类的视图转换。首先必须有一个根视图控制器,通过触发Storyboard里拖拽生成pushSegue或用pushControllerWithNames:代码将下一级视图压入(Push)堆栈并弹出时,会在标题栏前加上<左箭头,点击会返回上一级视图,也可以执行popController()代码,而直接返回根视图可以用popToRootController()。
2.Present - 与Push的方式比较类似,会跳转到一个Modal(模态)视图,区别是当前视图的控制器会被释放并执行didDeactivate方法,但我们仍然可以在模态视图里点标题栏或者在视图控制器代码调用dismissController()方法以重新激活上一个视图。
3.Next page - 分页视图模式,多个视图的横向并列排列,左右扫会切换,下方有小圆点进行标识。现在很多iOS应用启动时都有这种分页导航用于操作方法或新功能的提示。Storyboard里按住control从视图A拖到视图B选择next page可以建立此关系。
具体可以看下“WatchKit编程指南:WatchKit Apps--界面导航”这篇文章:
下面重点总结一些常见问题与解决方法:
1.Q:主控制器为分页视图时,无法push分级的视图栈;主控制器为分级视图时,无法push分页视图。
A:Page-based与Stack模式是互斥的,因此必须使用模态方式进行切换。主控制器为分页视图时,要正确弹出一个分级视图栈可以用presentControllerWithName:方法,而主控制器为分级视图时,要正确弹出单页视图,用
- presentControllerWithName:conext:
方法,而弹出多个页组成的分页视图,需要改为用
- presentControllerWithNames:contexts:
方法。
2.Q:怎么在视图间传递参数?
A: 利用context参数封装参数对象,若在push模式下需要传递视图控制器delegate,可参考本人之前翻译的那篇“WatchKit的代理与上下文”文章。
3. Q: 定义了ForceTouch时的上下文菜单,结果切换视图时再激活上下文菜单并点击时报错说视图指针丢失。
A: 因为你代码里是在awakeWithContext:里定义的上下文菜单,然后用模态方式弹出,这样切换视图后原视图被销毁就无法正确调用了菜单内容代码。解决方法是:I.用push方式切换视图,这样主视图存于视图栈并不会销毁对象;II.依旧用模态方式切换视图,但把上下文菜单定义代码放到willActivate()函数里,这样菜单定义会重新加载不至于失效。