WatchKit視圖轉(zhuǎn)換控制小結(jié)
對于WatchKit App,是可以在Storyboard里建立多個InterfaceController并像在iOS應(yīng)用一樣直觀的畫出視圖轉(zhuǎn)換連接的,當然我們也可以通過視圖控制器代碼實現(xiàn)相應(yīng)視圖切換與跳轉(zhuǎn)。
簡單來說視圖轉(zhuǎn)換連接有三種形式:
1.Push/Pop - 提供Hierarchical形態(tài)下基于棧(Stack)的視圖控制,Hierarchical意為分級視圖架構(gòu),效果類似iOS應(yīng)用里的Navigation界面,主要用于導(dǎo)航類的視圖轉(zhuǎn)換。首先必須有一個根視圖控制器,通過觸發(fā)Storyboard里拖拽生成pushSegue或用pushControllerWithNames:代碼將下一級視圖壓入(Push)堆棧并彈出時,會在標題欄前加上<左箭頭,點擊會返回上一級視圖,也可以執(zhí)行popController()代碼,而直接返回根視圖可以用popToRootController()。
2.Present - 與Push的方式比較類似,會跳轉(zhuǎn)到一個Modal(模態(tài))視圖,區(qū)別是當前視圖的控制器會被釋放并執(zhí)行didDeactivate方法,但我們?nèi)匀豢梢栽谀B(tài)視圖里點標題欄或者在視圖控制器代碼調(diào)用dismissController()方法以重新激活上一個視圖。
3.Next page - 分頁視圖模式,多個視圖的橫向并列排列,左右掃會切換,下方有小圓點進行標識?,F(xiàn)在很多iOS應(yīng)用啟動時都有這種分頁導(dǎo)航用于操作方法或新功能的提示。Storyboard里按住control從視圖A拖到視圖B選擇next page可以建立此關(guān)系。
具體可以看下“WatchKit編程指南:WatchKit Apps--界面導(dǎo)航”這篇文章:
下面重點總結(jié)一些常見問題與解決方法:
1.Q:主控制器為分頁視圖時,無法push分級的視圖棧;主控制器為分級視圖時,無法push分頁視圖。
A:Page-based與Stack模式是互斥的,因此必須使用模態(tài)方式進行切換。主控制器為分頁視圖時,要正確彈出一個分級視圖??梢杂胮resentControllerWithName:方法,而主控制器為分級視圖時,要正確彈出單頁視圖,用
- presentControllerWithName:conext:
方法,而彈出多個頁組成的分頁視圖,需要改為用
- presentControllerWithNames:contexts:
方法。
2.Q:怎么在視圖間傳遞參數(shù)?
A: 利用context參數(shù)封裝參數(shù)對象,若在push模式下需要傳遞視圖控制器delegate,可參考本人之前翻譯的那篇“WatchKit的代理與上下文”文章。
3. Q: 定義了ForceTouch時的上下文菜單,結(jié)果切換視圖時再激活上下文菜單并點擊時報錯說視圖指針丟失。
A: 因為你代碼里是在awakeWithContext:里定義的上下文菜單,然后用模態(tài)方式彈出,這樣切換視圖后原視圖被銷毀就無法正確調(diào)用了菜單內(nèi)容代碼。解決方法是:I.用push方式切換視圖,這樣主視圖存于視圖棧并不會銷毀對象;II.依舊用模態(tài)方式切換視圖,但把上下文菜單定義代碼放到willActivate()函數(shù)里,這樣菜單定義會重新加載不至于失效。