我正在展示一个WKInterfaceController
与另一个接口控制器的模式segue。WKInterfaceController与模态segue
当你在这个模式接口控制器的表中点击一行时,我该如何解除这个接口控制器并且返回到呈现接口控制器?
这是我当前的故事板设置。
[Root] -> [Push 1] -> [Push 2] -> [Modal]
我正在展示一个WKInterfaceController
与另一个接口控制器的模式segue。WKInterfaceController与模态segue
当你在这个模式接口控制器的表中点击一行时,我该如何解除这个接口控制器并且返回到呈现接口控制器?
这是我当前的故事板设置。
[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代码将无法正常工作。所有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;
}
}
谢谢!这确实有效,但呈现视图控制器不是根视图控制器,所以当弹出呈现视图控制器(Push 2)时,我不会看到我将删除此观察者的位置。我用设置编辑了我的帖子。 –
使用相同的策略。由于没有对'popController'的完成回调支持,当'Push2'弹出时选择一个点的唯一方法是'[Push1 activated]'。当你从push1推push2时,你必须存储一些状态变量来指示push2是否出现,以确定'[Push1 activated]'上的适当行为。 – jeeeyul
我最终只是在通知观察者的'Push 2'接口控制器的一个静态变量中,然后在之后的'-awakeFromContext:'调用中再次添加它之前删除了观察者。谢谢你的帮助! –