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