在 view# 1我在故事板中设置了两个控件;一个是导航栏中的UIBarButtonItem,另一个是UISegmentedController。前者是一个自定义绘制的图像,并且两个项目的色调都设置为紫色(在故事板属性检查器中设置色调)。
通过各种动作,用户可以通过 view# 1到达 view# 2。如果在视图#2中不满足某个条件,则显示错误信息,用户单击"确定"后将被重定向到视图#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];
}
}
事情是,当我返回到 view# 1使用popViewControllerAnimated:YES
函数,前面提到的两个控件(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 tint颜色,但我还不能弄清楚如何修复UIBarButtonItem tint问题。使用[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变量设置为 - 调用测试条件 的方法(在
- 如果条件不满足,将BOOL变量设置为
TRUE
- 在
viewDidAppear
中检查BOOL变量是否为真或不是。如果条件是您正在寻找的,则弹出一个视图。
FALSE
willViewAppear
中):
. 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];
}
}
这样就差不多了。在警报显示之前有轻微的停顿,但这是可以忽略不计的。现在,在流行之后,一切都是它应该的!