2012-03-13 52 views
0

我有一個下載在後臺運行。它顯示了一些失敗情況下的UIAlertView。延遲UIAlertView的顯示,直到顯示其關聯的viewController

發生此警報時,應用程序可以位於顯示給用戶的任何視圖中,但只能在其中一個視圖中顯示。

我可以推遲UIAlertView的呈現到與其相關聯的viewController向用戶顯示的時間(它的viewDidAppear方法被調用)嗎?

回答

2

聲明您想要顯示視圖的視圖控制器上的屬性。

@interface DownloadViewController : UIViewController 
{ 
    UIAlertView *downloadAlertView; 
} 

@property (retain) UIAlertView *downloadAlertView; 

@end 

然後,當你發現錯誤,設置視圖控制器的downloadAlertView財產(這將需要你保持由該做下載的對象這個視圖控制器的引用)。

- (void)downloadFailed 
{ 
    UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease]; 
    alertView.title = @"Download Failed"; 
    downloadViewController.downloadAlertView = alertView; 
} 
DownloadViewController實現

然後,

- (UIAlertView *)downloadAlertView 
{ 
    return downloadAlertView; 
} 

- (void)setDownloadAlertView:(UIAlertView *)aDownloadAlertView 
{ 
    // standard setter 
    [aDownloadAlertView retain]; 
    [downloadAlertView release]; 

    downloadAlertView = aDownloadAlertView; 

    // show the alert view if this view controller is currently visible 
    if (viewController.isViewLoaded && viewController.view.window) 
    { 
     [downloadAlertView show]; 
     downloadAlertView = nil; 
    } 
} 

- (void)viewDidAppear 
{ 
    if (downloadAlertView) 
    { 
     [downloadAlertView show]; 
     downloadAlertView = nil; 
    } 
} 

快速的解釋:

  • 前兩種方法都是標準的getter/setter方法,但二傳手增加了邏輯,所以,如果視圖控制器當前可見,則立即顯示警報。
  • 如果不是,則視圖控制器將存儲警報視圖,並在視圖出現時立即顯示。
+0

不錯的做法。我在上面,但是你能解釋'(viewController.isViewLoaded && viewController.view.window)'conditional ?,是否與'(self.navigationController.visibleViewController == self)'相同? – 2012-03-13 23:33:10

+0

不應該在代碼downloadAlertView中引用self.downloadAlertView? – 2012-03-13 23:39:34

+0

檢查setter的名字,應該是setDownloadAlertView。 – 2012-03-13 23:48:15