使用popViewControllerAnimated时,按钮色调会改变颜色

视图#1中,我在故事板中设置了两个控件; 一个是导航栏中的UIBarButtonItem ,另一个是UISegmentedController 。 前者是自定义绘制的图像,两个项目的色调都设置为紫色(故事板属性检查器中设置的色调)。

通过各种动作,用户可以通过视图#1进入视图#2 。 如果在View#2中未满足某个条件,则会向用户显示错误消息,并在单击“确定”后重定向回View#1

相关代码:

if(i == [self.itemsAvailable count]){ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Oh no!" message:@"Warning message text!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView show]; break; } 

请注意,警报是在while循环中触发的,因此break; 。 然后,以下函数返回到View#1

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == [alertView cancelButtonIndex]) { // Jump back one screen [self.navigationController popViewControllerAnimated:YES]; } } 

问题是,当我使用popViewControllerAnimated:YES函数返回View#1时 ,前面提到的两个控件( UIBarButtonItemUISegmentedController )的色调显示为灰色而不是所需的紫色。

选择不同的UISegmentedController值会返回适当的色调颜色,但是我需要将View#1留给UIBarButtonItem以返回正确的紫色色调。

为什么色调颜色会发生变化,如何解决这个问题,以便在弹回View#1时自动获得适当的色调颜色?

注意:

视图#1具有以下viewWillAppear函数

 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; // Unhide the nav bar (hidden on home screen) [self.navigationController.navigationBar setHidden:NO]; [self setUserDefaults]; // Load the appropriate values and set in UISegmentedController } 

哪里

 - (void) setUserDefaults { // Set the defaults from the settings int selectedValue; selectedValue = (int)[self.userDefaults integerForKey:@"SomeValue"]; [self.defaultsSegment setSelectedSegmentIndex:selectedValue]; } 

一些变量名称已被修改,一些代码已被省略,但这是重要的部分。 我不相信该函数与错误的色调颜色有任何关系,因为UIBarButtonItem永远不会通过代码修改并显示与UISegmentedController相同的错误。

编辑#1:

添加行[self loadView];viewWillAppear方法修复了UISegmentedController着色颜色,但我还不知道如何修复UIBarButtonItem色调问题。 使用行[self.navigationController loadView]; 导致一堆乱七八糟的问题。

编辑#2:

UIAlertView在一个方法中调用,该方法本身是从viewWillAppear调用的。 如果我将方法调用移动到viewDidAppear那么UIBarButtonItem将保留其正确的色调颜色。 但是视图中的图形突然出现在视图加载完毕之后 – 这是不雅观的。

问题的原因是在视图加载完成之前调用了popViewControllerAnimated

就这样……

viewWillAppear方法中,调用了另一个检查条件的方法,并决定是否弹出一个视图。 整个事情发生在视图甚至完成加载之前,这就是问题出现的地方。

尝试将其放在View#2中 ,然后从View#1导航到它:

 - (void)viewWillAppear:(BOOL)animated{ { [super viewWillAppear:animated]; [self.navigationController popViewControllerAnimated:YES]; } 

代码编译得很好,但是当您导航到View#2时,您将获得以下日志:

"nested pop animation can result in corrupted navigation bar"

基本上这就是我在流行音乐后改变色调颜色时遇到的问题。 方法popViewControllerAnimated在代码中足够深,它没有被Xcode捕获,但是到目前为止还没有产生一堆问题。

我做的解决方法如下:

  1. 创建一个BOOL变量@property (nonatomic) BOOL didFail;
  2. willViewAppear BOOL变量设置为FALSE
  3. 调用测试条件的方法(在willViewAppear
  4. 如果条件失败,请将BOOL变量设置为TRUE
  5. viewDidAppear检查BOOL变量是否为true。 如果条件是您正在寻找的,则弹出一个视图。

代码

.h文件

 @property (nonatomic) BOOL didFail; 

.m文件

 - (void)viewWillAppear:(BOOL)animated{ { [super viewWillAppear:animated]; self.didFail = FALSE; [self methodCall]; } - (void) methodCall { if(condition is met){ self.didFail = TRUE; } } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if(self.didFail == TRUE){ //alert message [self.navigationController popViewControllerAnimated:YES]; } } 

这就是要做的。 警报出现之前有一点暂停,但可以忽略不计。 现在流行之后一切都应该是应有的!