2014-02-05 30 views
0

我的用戶界面直到加載發生之後纔會更新,因此會影響等待消息的目的。當按下切換目標C時顯示等待消息

- (IBAction)toggle:(UISwitch *)sender { 

    [self.waitingMsg setHidden:NO];//UI should update here to show waiting message 

    [ThirdViewController scheduleNotifications:[NSDate date]]; 

    //Unfortunatly UI is not getting updating until the processing. 
} 

如何在處理開始前立即更新UI?

+0

究竟是什麼你將要處理什麼? – 68cherries

+0

我正在安排通知,我不明白爲什麼當我告訴它UI時,UI並未將我的等待消息設置爲可見。 – joe

+0

您是否真的在切換操作中運行切換方法?或者你是從代碼運行它?如果您從代碼運行它,請粘貼正在運行它的代碼。謝謝 – Fogmeister

回答

0

問題是用戶界面在您的代碼完成運行之後纔會實際繪製/更新。所以:

[self.waitingMsg setHidden:NO]; // this is just a command for what WILL happen 
[ThirdViewController scheduleNotifications:[NSDate date]]; // but now ... 
// ... your code keeps running... 
// ... so nothing can happen until AFTER scheduleNotifications returns 

解決的辦法是循環runloop一次,給畫有機會發生。就像這樣:

[self.waitingMsg setHidden:NO]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [ThirdViewController scheduleNotifications:[NSDate date]]; 
    /// ... and all the rest of your code goes here... 
}); 
+0

請參閱我關於此主題的書籍,名爲「延遲表演」:http://www.apeth.com/iOSBook/ch11.html#_delayed_performance – matt

+0

啊,我其實並不知道這一點。雖然它確實有道理。 – Fogmeister

+0

有關繪製實際發生時間的更多細節(我稱之爲「重繪時刻」):http://www.apeth.com/iOSBook/ch17.html#_drawing_animation_and_threading – matt

0

解決的問題,請參見下面的代碼:

- (IBAction)toggle:(UISwitch *)sender { 

    [self.waitingMsg setHidden:NO];//UI should update here to show waiting message 

    [self performSelector:@selector(scheduleFromToggle:) withObject:nil afterDelay:1.0]; 

} 


- (void)scheduleFromToggle:(id)sender { 

    [ThirdViewController scheduleNotifications:[NSDate date]]; 

    [self.waitingMsg setHidden:YES]; 

}