转载

WatchKit视图转换控制小结

WatchKit视图转换控制小结

对于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()函数里,这样菜单定义会重新加载不至于失效。

正文到此结束
Loading...