Swift - WatchKit 中的标签未从委托回调中更新
Swift - label not updating in WatchKit from delegate callback
我知道第一个问题会是"are you running the code in the main thread",答案是肯定的,我是。
我有一个界面控制器呈现模态,我使用委托回调关闭模态并更新文本标签。这是代码:
委托已声明
// 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()
})
}
现在模态被dismiss了,这里设置断点说明确实到了这个点,所有的变量都存在。但是标签根本不会更新。例如,在 willActivate
中调用相同的 setText
方法,可以正确更新它。只有从这个委托调用返回时它才不会。我在应用程序其他地方的类似地方也发生过这种情况。
您只能在初始化期间和考虑界面控制器时更新界面元素 "active." WKInterfaceController
在 willActivate
和 didDeactivate
调用之间处于活动状态。具体来说,willActivate
内可以更新接口,didDeactivate
期间不能更新。
当您调用您的委托时,它必须记住在其 willActivate
调用期间进行请求的更新。一旦关闭模式,就会发生这种情况。
您可以在我的 WatchKit Controller Life Cycle post.
中了解更多相关信息
我知道第一个问题会是"are you running the code in the main thread",答案是肯定的,我是。
我有一个界面控制器呈现模态,我使用委托回调关闭模态并更新文本标签。这是代码:
委托已声明
// 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()
})
}
现在模态被dismiss了,这里设置断点说明确实到了这个点,所有的变量都存在。但是标签根本不会更新。例如,在 willActivate
中调用相同的 setText
方法,可以正确更新它。只有从这个委托调用返回时它才不会。我在应用程序其他地方的类似地方也发生过这种情况。
您只能在初始化期间和考虑界面控制器时更新界面元素 "active." WKInterfaceController
在 willActivate
和 didDeactivate
调用之间处于活动状态。具体来说,willActivate
内可以更新接口,didDeactivate
期间不能更新。
当您调用您的委托时,它必须记住在其 willActivate
调用期间进行请求的更新。一旦关闭模式,就会发生这种情况。
您可以在我的 WatchKit Controller Life Cycle post.
中了解更多相关信息