對於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()函數裡,這樣菜單定義會重新加載不至於失效。