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

5
视图 #1中,我有两个控件在storyboard中设置; 一个是导航栏中的UIBarButtonItem,另一个是UISegmentedController。前者是自定义绘制的图像,两个项目的色调都设置为紫色(在storyboard属性检查器中设置色调)。
通过各种操作,用户可以通过视图 #1进入到视图 #2。如果在视图 #2中不满足某些条件,用户将显示错误消息,并在单击“OK”后重定向回视图 #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;。接下来的函数将返回到视图#1
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == [alertView cancelButtonIndex]) {
        // Jump back one screen
        [self.navigationController popViewControllerAnimated:YES];
    }
}

事情是这样的,当我使用popViewControllerAnimated:YES函数返回到视图 #1时,之前提到的两个控件(UIBarButtonItemUISegmentedController)的色调显示为灰色,而不是期望的紫色。
选择不同的UISegmentedController值会带回适当的色调颜色,但我需要离开视图 #1才能使UIBarButtonItem恢复到正确的紫色色调。
为什么色调颜色会改变,如何解决这个问题,使它们在弹回View #1时自动具有适当的色调颜色呢?
注: View #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:

viewWillAppear方法中添加[self loadView];一行可以修复UISegmentedController色调问题,但我还无法解决UIBarButtonItem色调问题。使用[self.navigationController loadView];会导致一系列问题。

编辑#2:

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

1个回答

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. willViewAppear中首先将BOOL变量设置为FALSE
  3. 调用测试条件的方法(在willViewAppear内)
  4. 如果条件失败,则将BOOL变量设置为TRUE
  5. viewDidAppear中检查BOOL变量是否为真或者不是。如果条件符合要求,则弹出一个视图。

代码

.h文件

@property (nonatomic) BOOL didFail;

.m file

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

好了,就这样。虽然有微小的暂停时间,但可以忽略不计。现在弹出窗口后,一切都完全正常!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接