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