2013-04-23 61 views
0

我正尝试创建类似于UIAlertView的我自己的视图。我通过添加一些子视图到我的自定义视图,然后将我的自定义视图作为子视图添加到[[[UIApplication sharedApplication].delegate window]中,完成了大部分工作。一旦按下警报视图中的按钮,我也实现了我自己的委托从窗口中删除视图。使用Grand Central Dispatch和UINavigationController的用户界面问题

当委托视图控制器加载时,它在后台运行一个方法,一旦完成,我在主队列上运行一个updateUI方法。在这个updateUI方法中显示了警报视图。我做到这一点使用GCD:

dispatch_async(dispatch_get_main_queue(), ^{ [self updateUI]; }); 

是我遇到的问题是,我的代表是嵌入在导航控制器视图控制器,当我按下“返回”键,弹出该委托视图控制器关闭之前后台方法完成后,警报视图将显示在父视图控制器上。在警报视图中按下按钮不会执行任何操作,因为代理现在不在导航控制器堆栈中。

有谁知道为什么这个警报视图仍然显示,我怎么能防止这种情况发生?我认为关闭代理视图控制器会阻止它的updateUI方法被调用,但它看起来好像是无论如何。

回答

0

当您的视图控制器从导航堆栈中删除时,它很可能仍然由您在后台运行的块保留。因此,尽管不在屏幕上,它仍然会收到您的消息。

如果我已经正确理解了你,你正在为你的应用程序窗口添加一个子视图。这就解释了为什么即使您的视图控制器不在屏幕上,您的自定义警报视图仍然存在。

不一定是最好的,但是避免显示警报视图的一种方法是检查视图控制器视图的超级视图。如果超级视图是,您的视图控制器不可见,您可以有效地避免显示警报。

+0

感谢您的回答。在阅读您的回复之后,我尝试了对块中的变量进行弱引用,但我还没有弄清楚如何使这种方法奏效。但检查视图的超级视图效果很好。再次感谢。 – Kevin 2013-05-03 18:47:16

相关问题