WKInterface 按钮不更改标题

WKInterface button doesn't change title

收到通知后我想更改按钮的标题,但它根本没有响应。我检查了它不是零并检查了我正在分配的文本,一切都很好。我做了 属性 类型 strong 而不是 weak 但没有成功。

- (void) setButtonTitleFromSelectedSearchResult:(NSNotification *)notif
{

    [self popController];

    self.sourceMapItem = [[notif userInfo] valueForKey:@"SelectedResult"];

    NSLog(@"The Selected Result is: %@", self.sourceMapItem.name);

    //Testing
    NSLog(@"%@", self.fromButton); // check it's not nil

    [self.fromButton setTitle:self.sourceMapItem.name];
}

如果您为 属性 fromButton 使用 IBOutlet,请确保它已连接到 Storyboard 上的 WKInteface,如下所示:

我使用的是最新的 XCode 6.3 及以下代码。 self.testBtn 与情节提要及其 WKInterfaceButton

绑定

我还附上了受影响结果的截图。

我正在 - (void)willActivate

中设置初始文本
- (void)willActivate {
    [super willActivate];
    [self.testBtn setTitle:@"Test"];
    [self performSelector:@selector(justDelayed) withObject:nil afterDelay:5.0]
}

-(void)justDelayed
{
    [self.testBtn setTitle:@"Testing completed...!!"];
}

我通过创建一个模型对象解决了此类问题,该模型对象具有 属性 类型 () -> (Void) 的块(在 swift 中)。我创建模型对象,在块中设置我希望推送 WKInterfaceController 在完成时执行的操作,最后将上下文中的模型对象传递给推送 WKInterfaceController。推送的 WKInterfaceController 将模型对象的引用作为 属性 保存,并在完成需要做的任何事情时以及在 func popController().

之后调用它的完成块

这对我来说适用于您所描述的模式以及删除详细信息控制器删除、网络调用、位置获取和其他任务的行。

你可以在这里看到我在说什么:https://gist.github.com/jacobvanorder/9bf5ada8a7ce93317170

使用 WatchKit,如果用户界面元素当前不可见,则无法更新。因此,如果您呈现了另一个界面控制器 "on top",则在您关闭呈现的控制器之前,您无法更新呈现控制器的任何界面元素。届时,您可以在其 willActivate 方法中安全地更新呈现控制器。

SushiGrass 传递方块的方法当然是一种有效的方法。然而,在我的测试中,我最终不得不管理多个块,并且许多后续块逆转了早期排队块所完成的(例如,首先将标签的文本更改为 "foo",然后 "bar" ,然后再次 "foo"。虽然这可行,但不是最佳选择。

我建议任何正在开发 WatchKit 应用程序的人都花点时间考虑他们想要如何考虑屏幕外(即当前不可见)的界面元素。 willActivate 是您的朋友,如果您要从一个控制器转移到另一个控制器,想出一种管理更新的方法是值得的。

为了它的价值,我已经在一个 JBInterfaceController subclass 中封装了很多这样的逻辑,它可以为您处理很多这样的事情。通过使用它作为您自己的界面控制器的基础 class,您可以简单地在添加的 didUpdateInterface 方法中更新您的元素。不幸的是,我还没有时间编写适当的文档,但是头文件和示例项目应该可以帮助您:https://github.com/mikeswanson/JBInterfaceController