2016-03-07 56 views
0

我正在使用UISplitView處理iPhone/iPad應用程序。在左側面板中,我有一個表格,單元格中的所有「Show Detail」細節都顯示在右側面板的導航控制器中。iOS viewDidAppear在視圖出現之前調用

在用戶選擇表中的一個選項後,我對新視圖做了一些冗長的計算,所以我有一個UIActivityIndi​​catorView,我在「viewWillAppear」中開始動畫。在viewDidAppear中,我執行計算,然後刷新相應的UI元素並停止UIActivityIndi​​catorView。

這可以在iPhone上按預期工作:用戶點擊表格中的項目,出現的新視圖沒有太多可說的(但有一點活動指示器顯示),然後一兩秒鐘後用正確的信息填充。

在iPad上,看起來應用程序在點擊表格中的項目後會凍結。然後數據在幾秒鐘後出現。 (這對我的測試iPad不是第一代迷你型產品沒有幫助,所以速度較慢。)沒有活動指示器。

在調試中,我發現viewDidAppear實際上在視圖出現之前被稱爲。在viewDidAppear方法返回之前,顯示內容沒有任何反應。我已經看到了這個斷點,但我也通過將NSLog語句放在viewDidAppear的開始和結尾處來證實它沒有斷點。

所以這看起來不好;我想知道是否有任何事情可以對Segue,View Controller,Navigation Controller或Split View控制器進行操作,使其按照我想要的方式運行?

在此先感謝...

回答

2

我最終通過添加延遲計算來解決這個問題。 viewDid出現在視圖出現之前的基本情況仍然令人討厭,但是此解決方法覆蓋了它。

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    // Use delayed computation to get around "viewDidAppear" sometimes being called before view appears. 
    [self.activityIndicator startAnimating]; 
    [self performSelector:@selector(delayedComputation) withObject:nil afterDelay:0.01f]; 
} 

- (void)delayedComputation 
{ 
    // (Perform lengthy calculations...) 
    // (Refresh UI with results...) 
    [self.activityIndicator stopAnimating]; 
} 
1

,因爲你這樣做來呈現數據的過程是相當大的和長期的你應該這樣做異步,你的表現受到影響,你需要什麼是內做到這一切

//Show you spinner here 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
     //Background Thread, your logic for get data 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 
      //Run UI Updates and hide spinner`enter code here` 

     }); 
    }); 

並且可能它會按您的意願行事。

相關問題