2012-12-03 39 views
2

我正在Xcode 4.2上開發iOS 5.1應用程序。 我有一個uitablcontroller與不同的選項卡。我的問題是當單擊一個選項卡時,應用程序會「凍結」幾秒鐘,並執行所有要執行的代碼,但它不會首先按原樣加載UIAlertView。iOS中的UITab凍結

我有在viewDidLoad中聲明的UIAlertView。 下面的代碼片段:

- (void)viewDidLoad 
{ 



NSLog(@"##### VIEW DID LOAD 1 #####"); 


// Display Alert: Loading 

alertView = [[UIAlertView alloc] initWithTitle:@"Loading" 
             message:@"\n" 
             delegate:self 
          cancelButtonTitle:nil 
          otherButtonTitles:nil]; 

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
spinner.center = CGPointMake(139.5, 75.5); // .5 so it doesn't blur 
[alertView addSubview:spinner]; 
[spinner startAnimating]; 
[alertView show]; 

[super viewDidLoad]; 


NSLog(@"##### VIEW DID LOAD 2 #####"); 


self.tableView.dataSource = self; 
self.tableView.delegate = self; 

[self callMainMethod]; 

} 

當單擊該選項卡上,我可以看到第一的NSLog的顯示在登錄,然後主要方法被調用,但不顯示UIAlertView中。

+0

勘誤表,我正在使用Xcode 4.5 – mhmdshawqi

+0

嘗試在自定義實現之前調用superview的'viewDidLoad'。 – Abizern

+0

##解決方案## emrys57的答案解決了問題!答案是將[self callMainMethod]移到viewDidAppear。我還需要在調用函數後根據需要放置[self.tableview reloadData]以查看錶中的數據。 – mhmdshawqi

回答

1

viewDidLoad正在運行時,可能是關聯的UIView的frame的大小爲零。我不知道,但UIAlertView可能會嘗試在這個零大小的框架中呈現自己。如果您在viewDidAppear中提供UIAlertView,是否有意義?

如果[self callMainMethod]計算能力很大,那麼顯示可能會在更新完成之後纔會更新。你可以嘗試將它移動到viewDidAppear。您也可以嘗試延遲它,以便UI線程的主運行循環,顯示更新的線程以及執行viewDidLoad和所有其他view...方法的線程有時間完成所有操作並在啓動之前變爲空閒狀態重處理。只有當運行循環完成所有處理時,它纔會開始實際更新顯示。就像這樣:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 200000000), dispatch_get_main_queue(), ^{ 
    [self callMainMethod]; 
} 

該文檔是在http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

如果這種懷疑是正確的,你應該再拿到UIAlertView彈出直線上升,只有有諸事死了,一會兒callMainMethod執行。

我希望我知道如何編寫,「只有在設法完成更新顯示後才能發送此塊」,但我不知道該怎麼做。所以上面的調度電話應該延遲200毫秒的電話callMainMethod,這通常很多。

如果有效,您應該可以開始另一個問題,例如「我在執行此方法時如何停止顯示凍結」。

+0

我嘗試在viewWillAppear和viewDidAppear中添加UIAlertView,並且在單擊該選項卡時仍然「凍結」,然後顯示數據和警報。謝謝你的迴應。我感謝您的幫助。 =) – mhmdshawqi

+0

至少這是進步。我更新了答案,你可以試試。 – emrys57

+0

就是這樣!非常感謝!將mainMethod移到ViewDidAppear的確解決了這個問題。非常感謝您提供非常詳細的解釋性答案。 – mhmdshawqi