我知道第一个问题是“你是在主线程中运行代码吗”,答案是肯定的,我是。
我有一个接口控制器呈现模态,我使用委托回调来关闭模态并更新文本标签。这是代码:
声明委托
// SetFooInterfaceController.swift
protocol SetFooInterfaceControllerDelegate: class {
func setFooInterfaceControllerDelegateDidTapSetFoo(foo: Int)
}
呈现VC将自身作为上下文传递,因此可以设置委托:
// SetFooInterfaceController.swift
weak var delegate: SetFooInterfaceControllerDelegate?
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
if let presentingVC = context as? FooDetailInterfaceController {
delegate = presentingVC
}
}
点击按钮时,会调用代理:
// SetFooInterfaceController.swift
@IBAction func setWeightButtonTapped() {
delegate?.setFooInterfaceControllerDelegateDidTapSetFoo(foo)
}
在呈现视图控制器中调用委托方法:
// FooDetailInterfaceController.swift
func setFooInterfaceControllerDelegateDidTapSetFoo(foo: Int) {
dispatch_async(dispatch_get_main_queue(), {
self.fooLabel.setText(String(foo))
self.dismissController()
})
}
现在模态被解除了,这里设置断点表明它确实达到了这一点并且所有变量都存在。但标签根本不更新。例如,在setText
中调用相同的willActivate
方法会正确更新它。只有从这个委托调用返回时它才会发生。我也在应用程序的其他地方发生过这种情况。
答案 0 :(得分:6)
您只能在初始化期间以及当接口控制器被视为“活动”时更新界面元素。" WKInterfaceController
和willActivate
来电之间有didDeactivate
个有效。具体来说,您可以在willActivate
内更新界面,但在didDeactivate
期间无法更新。
当您致电代理人时,必须记住在willActivate
来电期间进行所请求的更新。只要模态被解除,就会发生这种情况。
您可以在WatchKit Controller Life Cycle帖子中了解详情。