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." WKInterfaceControllerwillActivatedidDeactivate 调用之间处于活动状态。具体来说,willActivate内可以更新接口,didDeactivate期间不能更新。

当您调用您的委托时,它必须记住在其 willActivate 调用期间进行请求的更新。一旦关闭模式,就会发生这种情况。

您可以在我的 WatchKit Controller Life Cycle post.

中了解更多相关信息