Swift 当控制器不是当前页面时,WatchOS2 UI更新发送到基于页面的WKInterfaceController,但不更新任何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不会更改 加载数据需要时间,因此我不希望每次调

我有一个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
    }
}