2015-11-23 99 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:'调用中再次添加它之前删除了观察者。谢谢你的帮助! –

相关问题