2015-11-23 69 views
3

我正在展示一個WKInterfaceController與另一個接口控制器的模式segue。WKInterfaceController與模態segue

當你在這個模式接口控制器的表中點擊一行時,我該如何解除這個接口控制器並且返回到呈現接口控制器?

這是我當前的故事板設置。

[Root] -> [Push 1] -> [Push 2] -> [Modal] 

回答

3

我假設你是NSNotificationCenter友好。

起初,沒有辦法訪問父接口控制器,除非父控制器是根控制器。

[WKExtension sharedExtension].rootInterfaceController 

基本上,不推薦接口控制器之間的直接通信:

根控制器可以通過訪問。改爲使用NotificationCenter。因此,在你的模態控制器,做這樣的事情:

-(void) didTapARowInTable 
{ 
    NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; 
    [nc postNotificationName:@"UseDidTapARowFromModal" 
         object:self 
        userInfo:@{/* data that will be needed 
            to present new modal here */}]; 

    // close current modal. 
    [self dismissController]; 
} 

其次,當它不活躍的一個在WKInterfaceController任何UI代碼將無法正常工作。所有WKInterfaceObject都是與真實的遠程用戶界面相連的查詢對象(您知道故事板文件位於單獨的包中)。當沒有顯示遠程用戶界面時,它的界面控制器被取消激活,並且不能將用戶界面修改查詢發送給真實UI對象。它只能在未激活時修改它自己的狀態。

因此,父控制器不應該訪問任何UI API,直到它被激活(例如顯示新的模式或更改WKInterface對象)。所以,在你的父母控制器做這樣的事情:

-(void)didReceiveTapRowNotification:(NSNotification*) note 
{ 
    // just remember task to perform, don't use any UI code here. 
    _taskInfo = note.userInfo; 
} 

-(void)willActivate 
{ 
    [super willActivate]; 

    // check scheduled task and do it if exists. 
    if(_taskInfo){ 
     [self presentControllerWithName:@"modal-name" 
           context:_taskInfo]; 
     _taskInfo = nil; 
    } 
} 
+0

謝謝!這確實有效,但呈現視圖控制器不是根視圖控制器,所以當彈出呈現視圖控制器(Push 2)時,我不會看到我將刪除此觀察者的位置。我用設置編輯了我的帖子。 –

+0

使用相同的策略。由於沒有對'popController'的完成回調支持,當'Push2'彈出時選擇一個點的唯一方法是'[Push1 activated]'。當你從push1推push2時,你必須存儲一些狀態變量來指示push2是否出現,以確定'[Push1 activated]'上的適當行爲。 – jeeeyul

+0

我最終只是在通知觀察者的'Push 2'接口控制器的一個靜態變量中,然後在之後的'-awakeFromContext:'調用中再次添加它之前刪除了觀察者。謝謝你的幫助! –

相關問題