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

bil*_*tum 13 iphone uialertview ios ios7

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

// called when view controller receives a UIApplicationDidEnterBackgroundNotification
- (void)applicationDidEnterBackground:(NSNotification *)notification
{
    if (self.alertView) {
        [self.alertView dismissWithClickedButtonIndex:0 animated:NO];
        self.alertView = nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我的应用程序返回到前台而没有被终止时,警报视图就消失了.但是,导航栏中的条形按钮项(来自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;
    }
Run Code Online (Sandbox Code Playgroud)

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

我还尝试将主视图的tintAdjustmentMode设置为"normal"而不成功:

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

    self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
}
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*fez 9

我很确定这是苹果公司的一个错误.我已经在https://bugreport.apple.com上提交了一份错误报告,请提交一份重复的错误报告以让Apple注意它,因为这就是Apple如何优先处理错误.


sgo*_*sha 7

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


bil*_*tum 5

虽然我可以以编程方式关闭响应a的警报视图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;
    }
}
Run Code Online (Sandbox Code Playgroud)