0

我有一个 3 页的应用程序,当我从我的 WatchConnectivity 委托(即我的扩展委托)接收信息时,我将其委托给 InterfacController 以更新 UI。

但是,处理更新的代码运行,包括 UI 更新,但 UI 实际上没有更新。

似乎您只能在当前页面时更新 interfaceController 的 UI。

我的问题是,如果用户在数据进入时转到不同的页面,我如何知道当我返回该页面时,UI 是否已更新。如果我使用 Bool 来跟踪状态,则 Bool 将被更改,但 UI 不会更改。

加载数据需要时间,所以我不想每次调用 willActivate 时都重新加载数据。

4

2 回答 2

0
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
    }
}
于 2015-10-29T07:05:47.000 回答
0

不喜欢 iOS UIKit,所有的WKInterfaceObjects 都不是实际的 UI 对象。它们就像远程用户界面的遥控器。(您知道捆绑包包含故事板和捆绑包包含扩展是分开的,在沙盒概念中,您不能直接访问 UI 对象。)

WKInterfaceObject只有连接的 UI 处于活动状态,才会建立 s 和实际 UI 对象之间的连接。否则,任何通过WKInterfaceObjects 发送的查询都将被忽略。

点赞如下:

-(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.
}
于 2015-10-29T06:54:03.593 回答