如何在iOS 7中以编程方式正确解散UIAlertView?

时间:2013-10-09 23:15:57

标签: iphone ios ios7 uialertview

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

// 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用户界面转换指南声明如下:

  

当出现警报或操作表时,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设置为“normal”而不成功:

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

    self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
}

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

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

答案 2 :(得分: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;
    }
}