【问题标题】:Swift - label not updating in WatchKit from delegate callbackSwift - WatchKit 中的标签未从委托回调中更新
【发布时间】:2015-05-28 23:55:44
【问题描述】:

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

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

委托已声明

// 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()
  })
}

现在modal被dismiss了,这里设置断点说明确实到了这个点,所有变量都存在。但是标签根本不会更新。例如,在willActivate 中调用相同的setText 方法会正确更新它。只有当从这个委托调用返回时它才不会。我在应用程序的其他地方也发生了这种情况。

【问题讨论】:

    标签: ios swift delegates watchkit


    【解决方案1】:

    您只能在初始化期间和界面控制器被视为“活动”时更新界面元素。 WKInterfaceControllerwillActivatedidDeactivate 调用之间处于活动状态。具体来说,willActivate内可以更新接口,didDeactivate内不能更新。

    当您致电您的代理人时,它必须记住在其willActivate 呼叫期间进行请求的更新。一旦模式被解除,就会发生这种情况。

    您可以在我的WatchKit Controller Life Cycle 帖子中了解更多信息。

    【讨论】:

    • 谢谢,这成功了!对于那些想知道的人,这意味着在实现委托方法的父控制器中,我设置了更新的属性,但将setText 方法移到了willActivate 方法中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多