如何在iOS 7中以编程方式正确地取消UIAlertView?

13

当我的应用程序进入后台时,我的以模态方式呈现的视图控制器会像下面这样取消显示警告视图...

// called when view controller receives a UIApplicationDidEnterBackgroundNotification
- (void)applicationDidEnterBackground:(NSNotification *)notification
{
    if (self.alertView) {
        [self.alertView dismissWithClickedButtonIndex:0 animated:NO];
        self.alertView = nil;
    }
}
当我的应用程序返回到前台而没有被终止时,警告视图消失了。但是,导航栏中的栏按钮项(来自UINavigationController)仍然变暗,就好像警报视图仍在显示。
此外,关闭模态视图控制器(通过点击变暗的栏按钮项)会显示出呈现视图控制器的栏按钮项也变暗了。栏按钮项是可用的,但它们仍然变暗。
那么我该如何取消栏按钮项的变暗?或者说,在iOS 7中,当应用进入后台时,我该如何以编程方式正确地解除一个警报视图的显示?
《iOS 7 UI过渡指南》中提到:
当警报或操作表出现时,iOS 7会自动使其后面的视图变暗。为了响应这种颜色变化,使用tintColor进行渲染的自定义视图子类应该重写tintColorDidChange方法,在适当的时候刷新渲染。
我的导航栏和栏按钮项不是自定义视图;我没有对它们进行子类化。我在storyboard中使用了它们的默认属性创建了导航栏(同样适用于栏按钮项)。因此,我没有地方可以重写tintColorDidChange。
我的所有视图都使用tintColor属性的默认值。
我尝试重新设置tintColor属性为默认值,但没有成功:
if (self.alertView) {
        [self.alertView dismissWithClickedButtonIndex:0 animated:NO];
        self.view.tintColor = nil;
        self.view.window.tintColor = nil;
        self.alertView = nil;
    }

我也尝试在视图控制器的viewDidAppear:方法中重新设置色调颜色,但没有成功。

我还尝试将主视图的tintAdjustmentMode设置为“normal”,但也没有成功:

if (self.alertView) {
    [self.alertView dismissWithClickedButtonIndex:0 animated:NO];
    self.alertView = nil;

    self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
}

顺便提一下,如果应用程序在后台被终止,那么重新启动应用程序时,工具栏按钮项目的色调将正确(即未变暗)。


我的警告视图一直从后台过渡,这让我非常失望。我会进一步研究这个问题。 - HalR
使用[[UIApplication sharedApplication] keyWindow],检查当前活动窗口是什么。由于UIAlertView有自己的窗口,可能会导致该窗口无法正确解除,从而使您的栏(按钮项)变暗。您还可以尝试在应用程序再次变为活动状态之前将其解除(application:willEnterForeground:)。 - Scott Berrevoets
3个回答

9

这似乎更准确。如果操作系统在后台关闭模态窗口,那么它应该完全关闭。同时,在您的应用程序发送到后台之前,可以使用标准的 dismissWithClickedButtonIndex:animated: 方法来关闭它。 - Brenden
这个事情有进展了吗? - Zeeshan

7

我在我的应用程序中遇到了同样的错误,并成功地找到了解决方法。您需要在后台关闭UIAlertView后,在应用程序的主窗口上将tintAdjustmentMode设置为UIViewTintAdjustmentModeNormal。很容易:)


你是说要做 self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal; 对吧?我尝试过了,但对我没用。你是在 applicationDidEnterBackground 里面做的吗(那是我尝试的),或者你是在重新进入前台时做的? - Mohamed Hafez
@MohamedHafez 我称之为 -[UIAlertView dismissWithClickedButtonIndex:animated:] 后的下一行。 - sgosha

5

虽然我可以在响应UIApplicationDidEnterBackgroundNotification时以编程方式解除警报视图,但iOS 7中的自动色调变暗不会得到更新。

但是,如果我改为在响应UIApplicationWillResignActiveNotification中解除警报视图,则自动色调变暗行为将会响应。

// called when view controller receives a UIApplicationWillResignActiveNotification
- (void)applicationWillResignActiveNotification:(NSNotification *)notification
{
    if (self.alertView) {
        [self.alertView dismissWithClickedButtonIndex:0 animated:NO];
        self.alertView = nil;
    }
}

你应该像@Mohamed在下面所说的那样仍然提交一个错误报告。 - Brenden
请记住,打开控制中心和通知中心会导致您的应用程序失去活动状态,并导致警报被解除。这不是最佳行为。考虑使用sgosha的解决方案。 - Léo Natan
1
@LeoNatan 请解释一下。在iOS 7上,当有警告框弹出时,我无法从边缘滑动以显示控制中心或通知中心。 - bilobatum
嗯,这是一个很好的观点,但你仍然可以收到操作系统的警报,这也会使你的应用程序无法使用。 - Léo Natan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接