带有模态转场的 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 代码在非活动代码时将不起作用。所有 WKInterfaceObject
s 都是与真实远程 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;
}
}
我正在展示一个 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 代码在非活动代码时将不起作用。所有 WKInterfaceObject
s 都是与真实远程 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;
}
}