0

我正在尝试创建自己的类似于UIAlertView. 我已经通过在我的自定义视图中添加一些子视图然后将我的自定义视图作为子视图添加到[[[UIApplication sharedApplication].delegate window]. 我还实现了我自己的委托,以便在按下警报视图中的按钮后从窗口中删除视图。

当委托视图控制器加载时,它会在后台运行一个方法,一旦完成,我就会updateUI在主队列上运行一个方法。正是在这种updateUI方法中显示了警报视图。我使用 GCD 执行此操作:

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

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

有谁知道为什么仍然显示此警报视图,以及如何防止这种情况发生?我认为弹出委托视图控制器会阻止其updateUI方法被调用,但看起来无论如何都是这样。

4

1 回答 1

0

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

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

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

于 2013-05-02T11:45:29.157 回答