8

从通知回拨后,我试图更改按钮的标题,但它根本没有响应。我检查了它不是零并检查了我正在分配的文本,一切都很好。我做了属性类型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];
}
4

4 回答 4

4

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

SushiGrass 传递块的方法当然是一种有效的方法。然而,在我的测试中,我最终不得不管理多个块,并且许多后续块颠倒了之前排队的块已经完成的操作(例如,首先将标签的文本更改为“foo”,然后是“bar”,然后是“foo ” 再次。虽然这可以工作,但它不是最佳的。

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

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

于 2015-04-22T16:02:24.860 回答
3

我正在使用最新的 XCode 6.3 及以下代码。 self.testBtn与 Storyboard 及其绑定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...!!"];
}

在此处输入图像描述

在此处输入图像描述

于 2015-04-16T13:20:18.107 回答
2

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

IBOutlet

于 2015-04-02T07:50:14.107 回答
2

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

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

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

于 2015-04-20T21:21:41.503 回答