【发布时间】: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