2012-07-17 76 views
0

我們在iOS上的tableView上方顯示視圖時出現問題。我們的方法 是創建一個UIView,它是UIViewController的一個子類的子視圖,發送 它到後面,然後將它帶到didSelectRowAtIndexPath的前面。 我們使用XIB創建用戶界面。視圖層次是像 這樣的:UIView UITableView上方沒有顯示 - iOS

查看
- UIView的( 「載入中...」 視圖)
- - 的UILabel( 「載入中...」)
- - UIActivityIndi​​catorView
- UITableView的
- 的UILabel

這是我們正在做的嘗試,以顯示 「加載」 觀點:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Create a request to the server based on the user's selection in the table view 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    NSError *err; 

    // Show the "loading..." message in front of all the other views. 
    [self.view bringViewToFront:self.loadingView]; 
    [self.loadingWheel startAnimating]; 

    // Make the request 
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&err]; 

    // Stop animating the activity indicator. 
    [loadingWheel stopAnimating]; 

    // other stuff... 
} 

每當我們在 XIB中的所有其他視圖的前面離開「加載」視圖時,我們可以看到它看起來像我們想要的。但是,當我們在後面(根據上面的視圖層次)加載 視圖,然後嘗試將它放到前面 時,視圖將永不顯示。打印出self.view.subviews表明我們的 加載視圖實際上在視圖層次結構中。有趣的是,如果我們嘗試在didSelectRowAtIndexPath內更改我們視圖中的其他內容(例如, 更改已在視圖中顯示的標籤的背景色), 更改從不在模擬器上顯示。

回答

2

問題是同步請求。它會阻止主線程,所以活動指示器無法顯示。

一個簡單的解決方案是將數據異步加載到全局隊列中,並且在加載所有內容時調用主隊列。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Make the request 
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&err]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Stop animating the activity indicator. 
     [loadingWheel stopAnimating]; 

     // other stuff... 
    }); 
}); 

雖然上面的解決方案工作,它會阻止全局隊列,所以它不是理想的。看看通過NSURLConnection的異步加載。這在Apple的「URL加載系統編程指南」中有詳細的解釋。

+0

現在我們全部拿出了同步請求。雖然我們代碼的最終評論中提到的「其他內容」涉及發佈導致一些異步請求的通知,但我們的「加載」視圖仍然不會顯示。 – Peter 2012-07-18 18:29:33

+0

這對我來說很好。我只保留了兩行,將subview放在前面並開始動畫,並將'bringViewToFront:'改成'bringSubviewToFront:'(這是正確的方法名稱)。檢查一切是否與XIB文件連接,即確保self.view,self.loadingView等連接到正確的對象。 – 2012-07-19 08:36:06