Swift - 标签不会从委托回调更新WatchKit

时间:2015-05-28 23:55:45

标签: ios swift delegates watchkit

我知道第一个问题是“你是在主线程中运行代码吗”,答案是肯定的,我是。

我有一个接口控制器呈现模态,我使用委托回调来关闭模态并更新文本标签。这是代码:

声明委托

// 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方法会正确更新它。只有从这个委托调用返回时它才会发生。我也在应用程序的其他地方发生过这种情况。

1 个答案:

答案 0 :(得分:6)

您只能在初始化期间以及当接口控制器被视为“活动”时更新界面元素。" WKInterfaceControllerwillActivate来电之间有didDeactivate个有效。具体来说,您可以在willActivate内更新界面,但在didDeactivate期间无法更新。

当您致电代理人时,必须记住在willActivate来电期间进行所请求的更新。只要模态被解除,就会发生这种情况。

您可以在WatchKit Controller Life Cycle帖子中了解详情。