Swift 当控制器不是当前页面时,WatchOS2 UI更新发送到基于页面的WKInterfaceController,但不更新任何UI
我有一个3页的应用程序,当我从我的WatchConnectivity代理(即我的扩展代理)接收到信息时,我将其委托给InterfaceController来更新UI 但是,处理更新的代码会运行,包括UI更新,但UI实际上没有更新 似乎只有当interfaceController是当前页面时,您才能更新它的UI 我的问题是,如果用户在数据进入时转到另一个页面,我如何判断何时返回该页面,UI是否已更新。如果我使用Bool跟踪状态,Bool将被更改,但UI不会更改Swift 当控制器不是当前页面时,WatchOS2 UI更新发送到基于页面的WKInterfaceController,但不更新任何UI,swift,watchkit,apple-watch,watchos-2,wkinterfacecontroller,Swift,Watchkit,Apple Watch,Watchos 2,Wkinterfacecontroller,我有一个3页的应用程序,当我从我的WatchConnectivity代理(即我的扩展代理)接收到信息时,我将其委托给InterfaceController来更新UI 但是,处理更新的代码会运行,包括UI更新,但UI实际上没有更新 似乎只有当interfaceController是当前页面时,您才能更新它的UI 我的问题是,如果用户在数据进入时转到另一个页面,我如何判断何时返回该页面,UI是否已更新。如果我使用Bool跟踪状态,Bool将被更改,但UI不会更改 加载数据需要时间,因此我不希望每次调
加载数据需要时间,因此我不希望每次调用willActivate时都重新加载数据 不像iOS
UIKit
,所有的WKInterfaceObject
s都不是实际的UI对象。它们就像是远程用户界面的远程控制器。(您知道捆绑包包含故事板,捆绑包包含扩展是分开的,在沙盒概念中,您不能直接访问UI对象。)
只有连接的UI处于活动状态时,才会建立WKInterfaceObject
s与实际UI对象之间的连接。否则,将忽略通过WKInterfaceObject
s发送的任何查询
您喜欢以下内容:
-(void) willActivate {
_active = YES;
[super willActivate];
if(_needsUpdate){
[self refresh];
}
}
-(void) willDeactivate {
_active = NO;
[super willDeactivate];
}
// make it to be called when the data changes
-(void) dataDidChange:(NSNotification)* note {
// If active, refresh UI, otherwise flag it.
// It will be handled in next activation.
if(_active)
[self refresh];
else
_needsUpdate = YES;
}
-(void) refresh {
__needsUpdate = NO;
// Update your UI here.
}
class InterfaceController: WKInterfaceController {
private var needsUpdate = false
private var data: AnyObject?
override func willActivate() {
super.willActivate()
updateDataIfExists()
updateViewIfNeeded()
}
private func updateDataIfExists() {
let update: AnyObject? = "" // get new data from ExtensionDelegate
if let update = update { // do not forget check if update != data
data = update
needsUpdate = true
}
}
private func updateViewIfNeeded() {
guard needsUpdate else { return }
// UPDATE UI
needsUpdate = false
}
}