ios - Apple Watch : WKInterfaceLabel doesn't update on device, 但在模拟器上正常

标签 ios objective-c watchkit apple-watch

我的 WatchKit 应用 Storyboard上有一个 WKInterfaceLabel。每隔 30 秒,WatchKit 应用程序将向父 iPhone 应用程序发送请求以获取字符串。收到字符串后,我将该字符串设置为 WKInterfaceLabel 的文本。代码如下所示:

NSDictionary *getTokenRequest = @{@"request":@"getToken"};
[InterfaceController openParentApplication:getTokenRequest reply:^(NSDictionary *replyInfo, NSError *error) {
    if (error) {
        NSLog(@"%@", error);
    } else {
        token = replyInfo[@"token"];
        NSLog(@"token=%@", token); // I am getting the correct token
        // But the following line doesn't update label text
        [self refreshToken];
    }
}];

- (void)refreshToken {
    if ([token length] != 0) {
        [self.codeLabel setText:token];
    }
}

当应用程序启动或恢复时,标签将显示从父应用程序返回的正确字符串。这是由于在 willActivate 中调用了 refreshToken 造成的。不起作用的是,当我每 30 秒从父应用程序请求数据时,我也在请求的回调中调用 refreshToken,如上面的代码所示,即使我得到了正确的字符串( token 此处)从手机应用程序并调用 [self.codeLabel setText:token]。这是相同的方法调用:willActivate 中调用时,setText 可以很好地更新标签,但是在请求的回调方法中调用时,标签文本 UI 不会不更新。

此问题仅发生在设备上。在模拟器上运行时,标签文本按预期每 30 秒更新一次。

我在开发iPhone app的时候遇到过类似的问题,通过调用主线程的setText方法解决了:

[self performSelectorOnMainThread:@selector(refreshToken) withObject:nil waitUntilDone:NO]; 

遗憾的是,同样的修复方法不适用于 Apple Watch。

我还在这里找到了类似的线程:can setText for WKInterfaceLabel in init method but not in didselectrow method然而它并没有提供一个好的解决方案。

如有任何建议/想法,我们将不胜感激。提前致谢!

最佳答案

最后,这对我有用:

- (void)refreshToken {
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.codeLabel setText:token];
    });
}

感谢这篇文章http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/ .

简而言之,当 UI 没有按照您的指示更新时,它可能不会被安排在主线程上运行。

如我的问题所示,我已经怀疑线程问题并尝试使用 performSelectorOnMainThread 但它没有用。对于那些好奇的人,这是 performSelectorOnMainThreaddispatch_async 之间的区别:Whats the difference between performSelectorOnMainThread and dispatch_async on main queue?

关于ios - Apple Watch : WKInterfaceLabel doesn't update on device, 但在模拟器上正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30720693/

相关文章:

javascript - React-Native - 使用依赖于 node.js 核心模块的 Javascript 模块

ios - 委托(delegate)快速丢失 View Controller 对象

ios - 如何删除 UIViewController 类的 xib 文件?

objective-c - 如何使用 prepareForSegue 方法在目标 View 中设置 UIStepper 值?

ios - 如何从 NSError 代码中找到错误描述?

ios - UILabel 永远不会在 viewDidLoad 中初始化

ios - 范围内的iOS随机数

ios - 如何在iOS中识别不同连接的 watch

ios - WatchKit 错误显示自定义通知的时间太长。回落到静态

swift - 有什么方法可以访问 WKInterfaceButton 上的 pressesbegan 方法