带有模态转场的 WKInterfaceController

WKInterfaceController with modal segue

我正在展示一个 WKInterfaceController 带有来自另一个界面控制器的模态转场。

当您点击此模态界面控制器的 table 中的一行时,我如何关闭此界面控制器并与呈现界面控制器通信?

这是我当前的故事板设置。

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

我假设你和 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 代码在非活动代码时将不起作用。所有 WKInterfaceObjects 都是与真实远程 UIs 连接的查询对象(你知道故事板文件位于单独的包中)。当远程 UI 没有显示时,它的接口控制器被停用,它不能再发送 UI 修改查询到真正的 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;
    }
}