在NSNotificationCenter更新后,为什么我的UILabel没有刷新新信息?

时间:2010-11-15 01:57:45

标签: iphone xcode notifications uilabel

我正在开发一个天气应用程序,让一切正常工作完美 ...除了显示数据的UILabel之外。应用程序第一次加载后,它会通过并正确查找数据,然后显示它。

这是UILabel中的一个,在我的主RootViewController中:

UILabel *myCityLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 200, 80)];
[myCityLabel setText:[NSString stringWithFormat:@"%@",placemark.locality]];
myCityLabel.textAlignment = UITextAlignmentLeft;
myCityLabel.textColor = [UIColor blackColor];
myCityLabel.font = [UIFont fontWithName:@"Helvetica" size:24];
myCityLabel.backgroundColor = [UIColor clearColor];
[self.view addSubview:myCityLabel];
[myCityLabel release];

我在后台运行CoreLocation。在我的appDelegate中,我看到一旦再次调用应用程序(关闭它之后)就会调用这两个方法:

- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"applicationDidBecomeActive:");

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceNotificationReceived:) name:UIApplicationDidBecomeActiveNotification object:nil];

/*
 Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
 */

lbsViewController = [[LBSViewController alloc] init];
[lbsViewController viewDidLoad];
}

- (void)deviceNotificationReceived:(NSNotification *)notification
{
    NSLog(@"was this received?");
}

我在这里要做的是启动lbsViewController的 viewDidLoad 方法(我的主要RootViewController。我可以通过控制台看到它正在返回新信息,甚至函数viewDidLoad是被调用,但标签没有使用新数据刷新...有关我可以采取哪些途径来解决此问题的任何建议?

我应该注意到,UILabel唯一一次使用新数据刷新是将应用程序从Xcode构建到我的设备。

2 个答案:

答案 0 :(得分:2)

你说你通过删除多任务来解决问题。您的问题是您从后台线程发送的NSNotification到达相同的后台线程,并且您尝试从该后台线程更新您的UILabel。这是不允许的 - 您必须从主线程更新UI元素。

要解决此问题,您可以使用以下方法对主线程的调用进行编组:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

所以,像这样(在你的通知处理程序中):

[viewController.outputLabel performSelectorOnMainThread: @selector( setText: ) withObject: currentChar waitUntilDone: YES];

请注意,这与我对此问题的回答相同:How do I display characters to a UILabel as I loop through them?

答案 1 :(得分:0)

这两行:

lbsViewController = [[LBSViewController alloc] init];
[lbsViewController viewDidLoad];

正在分配一个全新的LBSViewController并在其上调用viewDidLoad。可能你想在你现有的lbsViewController对象上调用viewDidLoad而不是分配一个新对象(即删除这两行中的第一行)。

在任何情况下,让视图控制器观察通知本身并在内部处理所有内容最好。这种重载了viewDidLoad的含义,添加一个带有替代名称的方法可以说是以奇怪的方式分配逻辑。