2013-10-09 36 views
13

当我的应用程序进入的背景下,我提出了模态视图控制器解聘警报视图是这样的...如何在iOS 7中以编程方式正确解除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 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; 
} 

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

+0

我的警报视图已经通过从背景过渡到很多我的沮丧。我也会看更多。 – HalR

+0

使用'[[UIApplication sharedApplication] keyWindow]',检查当前活动窗口是什么。由于UIAlertView具有自己的窗口,因此可能是该窗口不能正确解除,使您的栏(按钮项)变暗。您也可以在应用程序再次激活之前尝试解除它('application:willEnterForeground:')。 –

回答

9

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

+0

这似乎更准确。如果操作系统在背景上解除了模态,那么它应该完全执行。与此同时,你可以使用标准的'dismissWithClickedButtonIndex:animated:'在你的应用程序发送到后台之前关闭它 – Brenden

+0

在这件事情上的任何进展? – Xeieshan

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; 
    } 
} 
+0

你仍然应该像下面的@Mohamed那样提交一个bug。 – Brenden

+0

请记住,打开控制中心和通知中心会导致应用程序退出活动状态,并导致警报被解除。这不是最佳的行为。考虑使用sgosha的解决方案。 –

+1

@LeoNatan请解释。在iOS 7上,当屏幕上出现警报时,我无法从边缘轻扫以显示控制中心或通知中心。 – bilobatum

7

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

+0

你是说'self.view.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;'对吗?我试过了,它不适用于我,你是否在'applicationDidEnterBackground'(这就是我试过的)中做这件事,或者当你重新进入前景时你正在做它? –

+0

@MohamedHafez我把它称为下一行后 - [UIAlertView dismissWithClickedButtonIndex:animated:] – sgosha

相关问题