Ios 延迟UIAlertView的显示,直到显示其关联的viewController

Ios 延迟UIAlertView的显示,直到显示其关联的viewController,ios,uialertview,Ios,Uialertview,我有一个在后台运行的下载。它显示某个失败条件下的UIAlertView 发生此警报时,应用程序可以显示在向用户显示的任何视图中,但只能在其中一个视图中可见 我是否可以将UIAlertView的显示延迟到与之关联的viewController显示给用户时(调用了它的ViewDidDisplay方法)?在视图控制器上声明要显示视图的属性 @interface DownloadViewController : UIViewController { UIAlertView *downloadAl

我有一个在后台运行的下载。它显示某个失败条件下的UIAlertView

发生此警报时,应用程序可以显示在向用户显示的任何视图中,但只能在其中一个视图中可见


我是否可以将UIAlertView的显示延迟到与之关联的viewController显示给用户时(调用了它的ViewDidDisplay方法)?

在视图控制器上声明要显示视图的属性

@interface DownloadViewController : UIViewController
{
    UIAlertView *downloadAlertView;
}

@property (retain) UIAlertView *downloadAlertView;

@end
然后,当检测到错误时,设置视图控制器的downloadAlertView属性(这将要求您通过正在下载的对象保留对此视图控制器的引用)

然后在您的
下载视图控制器
实现中

- (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,但setter添加了逻辑,因此如果视图控制器当前可见,则会立即显示警报
  • 否则,警报视图将由视图控制器存储,并在视图出现时立即显示

不错的方法。我在上面,但是你能解释一下
(viewController.isViewLoaded&&viewController.view.window)
条件吗?它和
(self.navigationController.visibleViewController==self)
一样吗?你不应该在code downloadAlertView中引用self.downloadAlertView吗?检查setter的名称,应设置为DownloadAlertView。@DavidCasilla作为
(viewController.isViewLoaded&&viewController.view.window)
行相当于
self.navigationController.visibleViewController==self
,但如果视图控制器以模式显示或在UIAbbarController中,则该行也可以工作。在类中,可以直接使用实例变量,因为您知道getter实现只是返回这个变量。有些人可能会考虑这种糟糕的风格,但我看不出问题。谢谢你提醒二传手!
- (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;
    }
}