使用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时 ,前面提到的两个控件( UIBarButtonItem和UISegmentedController )的色调显示为灰色而不是所需的紫色。
选择不同的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捕获,但是到目前为止还没有产生一堆问题。
我做的解决方法如下:
- 创建一个BOOL变量
@property (nonatomic) BOOL didFail;
- 在
willViewAppear
BOOL变量设置为FALSE
- 调用测试条件的方法(在
willViewAppear
) - 如果条件失败,请将BOOL变量设置为
TRUE
- 在
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]; } }
这就是要做的。 警报出现之前有一点暂停,但可以忽略不计。 现在流行之后一切都应该是应有的!