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

时间:2014-06-28 21:04:58

标签: ios objective-c uistoryboard popviewcontrolleranimated

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

通过各种操作,用户可以通过 查看#1 进入 查看#2 。如果在 查看#2 中未满足某个条件,则会向用户显示错误消息,并重定向回 查看#1 < / em> 点击&#34;确定&#34;。

相关代码:

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;。然后,以下函数返回 查看#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 值会返回适当的色调颜色,但我需要为 UIBarButtonItem保留 View#1 返回正确的紫色色调。

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

注意:

查看#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 相同的错误。 / p>

编辑#1:

将行[self loadView];添加到viewWillAppear方法会修复 UISegmentedController 色调,但我还不知道如何修复 UIBarButtonItem 色彩问题。使用行[self.navigationController loadView];会导致一大堆问题。

编辑#2:

在{strong> UIAlertView 调用的方法中调用viewWillAppear。如果我将方法调用移至 viewDidAppear ,则UIBarButtonItem会保留其正确的色调。但是视图中的图形突然出现在视图加载完毕后 - 这是不雅观的。

1 个答案:

答案 0 :(得分:2)

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

就是这样......

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

尝试将其放入 查看#2 ,然后从 查看#1 导航到:

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

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

"nested pop animation can result in corrupted navigation bar"

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

我做的解决方法如下:

  1. 创建BOOL变量@property (nonatomic) BOOL didFail;
  2. FALSE
  3. 中首先将BOOL变量设置为willViewAppear
  4. 调用测试条件的方法(在willViewAppear内)
  5. 如果条件失败,请将BOOL变量设置为TRUE
  6. viewDidAppear内查看BOOL变量是否为true或 不。如果条件符合您的要求,则弹出一个视图。
  7. <强> CODE

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

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