无法在主线程上更新UI

时间:2016-06-16 21:29:11

标签: ios objective-c ios9 cllocationmanager

我正在尝试更新UILabel中的文字,但我无法更改。

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

- (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];

但仍然没有任何反应。

更新

我发现了另一个类似的案例,所以我知道它与位置管理器无关 - 阻止self执行更新。

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

1 个答案:

答案 0 :(得分:0)

搞定了.. UIView初始化代码第二次被触发,一个重复的视图出现在我正在改变的视图前面,看起来这些更改没有效果。