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、すべてWKInterfaceObjectの は実際の UI オブジェクトではありません。それらは、リモート UI 用のリモート コントローラーのようなものです。(バンドルにはストーリー ボードが含まれ、バンドルには拡張機能が含まれていることがわかります。サンド ボックスの概念では、UI オブジェクトに直接アクセスすることはできません。)

WKInterfaceObjectと実際の UI オブジェクトとの間の接続は、接続された UI のみがアクティブになります。それ以外の場合、s を介して送信されたクエリWKInterfaceObjectは無視されます。

以下のようにします:

-(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 に答える