2016-06-16 75 views
0

我正在尝试更新UILabel中的文本,但无法更改它。无法更新主线程上的UI

更新由两个按钮之一触发。第一个按钮正常工作,这里是它的事件处理程序:

- (void)laterPressedForLocation { 
    self.locationLabel.text = @"Location off"; 
    // works as expected... 
} 

第二个按钮不会不管我怎么努力更新文本,这里是它的事件处理程序:

// ask for location permission.... 
- (void)acceptPressedForLocation { 
    _clLocManager = [[CLLocationManager alloc] init]; 
    _clLocManager.delegate = self; 
    if ([_clLocManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
     [_clLocManager requestWhenInUseAuthorization]; 
} 

// called when location permissions change 
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.locationLabel.text = @"Location permission updated"; 
     // always runs, but does not work 
    }); 
} 

如果我把一个断点或NSLog声明,其中的文本更改是,我看到代码已执行,块完成 - 但文本从未实际更改。

请注意,这个UILabel在代码的其他地方没有改变。

如何强制UI更新?

我试图拖延这样的更新:

[self performSelector:@selector(updateText) withObject:nil afterDelay:0.01f]; 

,但仍然没有任何反应。

UPDATE

我发现了另一个类似的情况,所以我知道它无关,与位置管理器 - 这是从执行更新阻止self ..

父视图有一个按钮,它调用removeFromSuperview在顽固的UILabel视图上,当我按下该按钮时,没有任何反应,UIView不会去任何地方。我的所有其他视图仍然正常工作 - 什么会导致一个UIView停止响应UI更新?

+0

我的猜测是,在代码被调用的时候,locationLabel是零。 –

+0

没有它的重用,它正在显示别的东西,我想改变它 – Cbas

+0

幽默我。在更新标签的代码中添加一个断点,并在它到达断点时检查它是否为零。 –

回答

0

知道了.. UIView初始化代码被第二次触发,并且重复的视图位于我正在更改的视图的前面,使得看起来这些更改没有效果。