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