2010-08-10 25 views
0

我有這個功能運行的iPhone3G在我的ViewControllerviewDidAppear,但viewDidShowToUser在哪裏?

- (void)viewDidAppear:(BOOL)animated { 

[super viewDidLoad]; 

} 

我使用的TabBar iPhone應用程序。但是,當我從選項卡1單擊到選項卡2並調試secondView控制器時,它在視圖實際上位於用戶視圖之前停止。

因此,當你點擊標籤2,直到每個函數內部 - (void)viewDidAppear:(BOOL)動畫完成後,用戶可以看到視圖。

函數ViewDidShowToUser在哪裏?現在我有幾個功能運行,所以它有時慢,你在想按鈕不工作真的..

回答

1

你在viewDidLoad中調用超:viewDidAppear內:....改變線[super viewDidLoad];[super viewDidAppear:animated];

+0

謝謝你們。但是問題也在IB內部。 Couse:當我調試我的應用程序。 它觸發viewDidLoad中首先的cellForRowAtIndexPath後.... 我認爲是文件的所有者的病程是一個視圖控制器,並增加了委託和數據源的協議。在我的其他應用程序viewDidload觸發cellForRowAtIndex路徑後,我的其他應用程序是一個TableViewController ... 但在這個時候我的看法是一些更復雜,所以我使用視圖內的小tableView ..好吧,我會嘗試選項2. 謝謝 – 2010-08-10 16:15:07

4

首先,你打電話[super viewDidLoad]而不是[super viewDidAppear:animated]你的實現-viewDidAppear:

其次裏面,使用調試器和斷點給出了您的應用程序的行爲人工視圖。在真實世界中,用戶不會注意到-viewDidAppear:方法在實際顯示視圖之前返回。

真正的問題是你的工作需要花費很長時間才能完成,並使應用顯得呆滯。你應該考慮異步執行這項工作,並且你有幾個選擇來做到這一點。

  1. 在你viewDidAppear:實現,你可以使用performSelector:withObject:afterDelay:排隊的工作。此方法將立即返回並安排您的選擇器在您指定的任何時間段內被調用。如果您將0作爲延遲傳遞,它將排隊等待運行循環的下一次迭代,從而有效地爲您提供了一種從方法返回並保持用戶界面響應的方式。

  2. 如果您的目標不是iOS4以下的任何目標,您可以使用塊,並利用Grand Central Dispatch的強大功能來安全地完成您的工作。

0

有沒有簡單的方法來告訴。

UIKit製作UIViews。 UIViews吸引CALayers。 CALayers由CoreAnimation處理。

CoreAnimation決定何時要求UIView繪製圖層。它在屏幕上繪製所有圖層,然後將它們合成到GPU上。只有在它們合成之後,屏幕纔會顯示更新的UI。這種解耦是爲了讓CoreAnimation獨立於UI線程完成大部分工作,但這意味着您無法輕易分辨「屏幕上實際顯示的內容」。

沒有簡單的方法可以告訴屏幕何時實際顯示了某些內容(除了現在私有的UIGetScreenImage())之外。 viewDidAppear:在UIKit完成構建(和動畫)視圖/圖層後被調用。此時,它們將在下一次運行循環後由CoreAnimation「看到」,並在此後不久顯示。如果你在viewDidAppear中做了很多處理,那麼CoreAnimation將永遠不會看到更新的「模型樹」。