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



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函数,前面提到的两个控件(UIBarButtonItemUISegmentedController)有他们的色调显示为灰色,而不是所需的紫色。

选择不同的UISegmentedController值带回适当的色调颜色,但我需要离开 view# 1UIBarButtonItem返回到适当的紫色色调。

怎么来的色调颜色正在改变,我怎么能补救这个问题,使他们自动有适当的色调颜色弹出回到 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捕获,但还没有到没有产生一堆问题的地步。

我所做的解决方法如下:

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

:

. 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];
    }
}

这样就差不多了。在警报显示之前有轻微的停顿,但这是可以忽略不计的。现在,在流行之后,一切都是它应该的!

相关内容

  • 没有找到相关文章

最新更新