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更新?
我的猜測是,在代碼被調用的時候,locationLabel是零。 –
沒有它的重用,它正在顯示別的東西,我想改變它 – Cbas
幽默我。在更新標籤的代碼中添加一個斷點,並在它到達斷點時檢查它是否爲零。 –