在不同的视图中更新UILabel

时间:2014-12-09 21:24:15

标签: ios objective-c uilabel ibeacon appdelegate

我是iOS开发人员的新手。我一直试图找到答案,但没有明确的解决方案..

我有一个名为FirstView.m的视图

还有AppDelegate.m

后台任务正在AppDelegate.m中运行,该任务根据距离手机最近的信标更新名为“text”的变量。

当应用程序在FirstView中时,我想根据AppDelegate的变量文本更新FirstView内的UILabel。

我知道这可以通过在FirstView中运行后台线程来完成,每1秒检查AppDelegate中的变量是否被更改,但这对我来说似乎没有效果,没有必要运行两个后台同一任务的线程。

我的问题是,有没有办法从AppDelegate本身更新标签? performSelectorOnMainThread上的东西?

谢谢!

2 个答案:

答案 0 :(得分:0)

只要值发生变化,您就可以在AppDelegate的userInfo字典中发布带有文本的通知:

text = [iBeacon updateText]; // just a random method name I made up
[[NSNotificationCenter defaultCenter] postNotificationName:@"textChanged"
                                                    object:self
                                                  userInfo:@{@"text":text}];

然后在FirstView中,您可以收听该通知以更新UI(通常位于viewDidLoadviewDidAppear:)。确保在视图控制器在FirstView中的某处释放之前取消注册,这样就没有内存泄漏。注册和更新UI的示例

您可以这样注册:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleTextChanged:)
                                             name:@"textChanged"
                                           object:nil];

然后更新UI:

- (void)handleTextChanged:(NSNotification *)notification
{
    // Be sure to update the UI on the main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        self.label.text = notification.userInfo[@"text"];
    });
}

最后,取消注册通知:

[[NSNotificationCenter defaultCenter] removeObserver:self];

答案 1 :(得分:0)

您还可以使用keyValue Observing尝试相同的方法。请参阅此Apple Documentationhow to implement the same.