5

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

通过各种操作,用户可以通过View #1到达View #2如果在View #2中不满足某个条件,则会向用户显示一条错误消息,并在单击“OK”时重定向回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];
    }
}

问题是,当我使用该函数返回View #1popViewControllerAnimated:YES时,前面提到的两个控件(UIBarButtonItemUISegmentedController)的色调显示为灰色而不是所需的紫色。

选择不同的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。如果我将方法调用移动到,viewDidAppearUIBarButtonItem保留其正确的色调颜色。但是,在视图完成加载后,视图中的图形突然出现——这很难看。

4

1 回答 1

2

问题的原因是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. 将 BOOL 变量设置为FALSEfirst thing inwillViewAppear
  3. 调用willViewAppear测试条件的方法(内部)
  4. 如果条件失败,则将 BOOL 变量设置为TRUE
  5. 检查BOOLviewDidAppear变量是否为真。如果条件是您要查找的内容,则弹出一个视图。

代码

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

这样就可以了。在警报出现之前会有轻微的停顿,但可以忽略不计。现在,在流行音乐之后,一切都应该是这样!

于 2014-06-29T03:25:33.233 回答