2016-06-16 103 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初始化代碼被第二次觸發,並且重複的視圖位於我正在更改的視圖的前面,使得看起來這些更改沒有效果。