如何在 iOS 7 中以编程方式正确关闭 UIAlertView?

Posted

技术标签:

【中文标题】如何在 iOS 7 中以编程方式正确关闭 UIAlertView?【英文标题】:How to properly dismiss a UIAlertView programmatically in iOS 7? 【发布时间】:2013-10-09 23:15:57 【问题描述】:

当我的应用进入后台时,我的模态显示视图控制器会像这样关闭警报视图...

// 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 以在适当时刷新渲染。

我的导航栏和栏按钮项不是自定义视图;我没有对它们进行子类化。我在情节提要中使用它们的默认属性创建了导航栏(与栏按钮项相同)。所以我没有地方覆盖 tintColorDidChange。

我的所有视图都使用其 tintColor 属性的默认值。

我尝试将色调颜色重新设置为默认值,但没有成功:

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

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

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

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

    self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;

顺便说一句,如果应用程序在后台被终止,应用程序会重新启动,并且条形按钮项目具有正确的色调(即未变暗)。

【问题讨论】:

我的警报视图已经从后台过渡到了,这让我很沮丧。我也会多看看这个。 使用[[UIApplication sharedApplication] keyWindow],检查当前活动窗口是什么。由于 UIAlertView 有自己的窗口,因此该窗口可能没有正确关闭,从而使您的栏(按钮项)变暗。您也可以尝试在应用再次激活之前将其关闭 (application:willEnterForeground:)。 【参考方案1】:

我很确定这是 Apple 的一个错误。我已在https://bugreport.apple.com 提交了错误报告,请提交一份重复的错误报告以让 Apple 关注它,that is how Apple assigns priority to bugs。

【讨论】:

这似乎更准确。如果操作系统在后台关闭模式,那么它应该完全做到这一点。同时,您可以使用标准 dismissWithClickedButtonIndex:animated: 在您的应用发送到后台之前将其关闭 这件事有进展吗?【参考方案2】:

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

【讨论】:

你是说self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal; 对吗?我试过了,但它对我不起作用,你是在 applicationDidEnterBackground 中做的(这就是我试过的),还是当你重新进入前台时你在做? @MohamedHafez 我在 -[UIAlertView dismissWithClickedButtonIndex:animated:] 之后的下一行调用它【参考方案3】:

虽然我可以通过编程方式关闭警报视图以响应 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 下面所说的那样提交一个错误。 请记住,打开控制中心和通知中心会导致您的应用退出活动状态,并会导致警报被解除。这不是最佳行为。考虑使用 sgosha 的解决方案。 @LeoNatan 请解释一下。在 iOS 7 上,当屏幕上显示警报时,我无法从边缘滑动以显示控制中心或通知中心。 嗯,这是一个很好的观点,但您仍然可以获得操作系统警报,这也会使您的应用程序处于非活动状态。

以上是关于如何在 iOS 7 中以编程方式正确关闭 UIAlertView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios中以编程方式设置两个按钮之间的特定距离[关闭]

如何在iOS 7中以编程方式设置设备方向?

如何在 xcode 5 iOS 7 中以编程方式编辑 plist?

在折叠显示中以编程方式关闭详细视图控制器?

如何在 iOS 开发中以编程方式使用接近传感器?

在 imagePickerController IOS 7 中以编程方式删除状态栏