在iPhone上使用UINavigationController中的setViewController行为不正常

时间:2010-12-03 13:45:36

标签: objective-c uinavigationcontroller pushviewcontroller

我在使用UINavigationController的iPhone App时遇到问题。当我使用pushNavigationController时,它工作正常。 iPhone切换到下一个ViewController时会动画。但是当使用ViewControllers数组和setViewControllers方法时,它在动画中有一个小故障,它可以变成一个清晰可见的动画bug。

在根ViewController中调用以下代码段。根据条件,它应该切换到ViewController1,或者它应该直接转到ViewController2。在后一种情况下,用户可以导航回vc1,然后导航到根。

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2];
// put us on the stack
[viewControllers addObject:self];
// add first VC
AuthentificationViewController* authentificationViewController =
  [[[AuthentificationViewController alloc] initWithNibName:@"AuthentificationViewController" bundle:nil] autorelease];
[viewControllers addObject:authentificationViewController];

if (someCondition == YES)
{
 UserAssignmentsListViewController* userAssignmentsListViewController =
      [[[UserAssignmentsListViewController alloc] initWithNibName:@"UserAssignmentsOverviewViewController" bundle:nil] autorelease];

 [viewControllers addObject:userAssignmentsListViewController];
}

[self.navigationController
  setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES];

如您所见,我将第一个也许是第二个VC添加到数组中,最后使用动画设置navigationController堆栈。如果我只添加第一个控制器,这可以正常工作。但是在动画应该转到第二个控制器的情况下,导航栏的标题将不会“飞入”。相反,在动画结束之前会有一个空标题。而且,更糟糕的是,如果我用自定义按钮替换导航栏标题,此按钮将显示在左上角,直到动画完成。这是一个非常显示的错误。

我尝试使用多种pushViewController方法的解决方法,但动画看起来不合适。我希望导航以与pushViewController相同的方式进行动画制作。这里唯一的区别是,我不添加VC,而是立即设置整个堆栈。这里有另一种解决方法,还是可以将其视为框架的错误?我想过只使用pushNavController for VC2,然后以某种方式将VC1插入堆栈,但这似乎不可能。

感谢所有提示和建议。 : - )

技术数据:我使用的是iOS 4.2,编译为4.0。

1 个答案:

答案 0 :(得分:5)

最后我找到了解决方案。错误是新的顶级NavigationController尚未初始化并正确加载,直到动画完成。在我的例子中,UserAssignmentsListViewController有一个viewDidLoad方法,在动画完成之前不会被调用,但是它设置了导航标题(这里:一个UIButton)。因此动画失败。

解决方案是在将其推入堆栈时引用已初始化的视图控制器。所以在某处初始化我们的顶级VC:

// initialize our top-level controller
ViewController* viewController2 = [[[ViewController alloc]
    initWithNibName:@"ViewController" bundle:nil] autorelease];

然后当将两个或多个VC推入堆栈时,顶级一个已经初始化并且动画正常工作(遵循原始问题的示例):

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2];
// put us on the stack, too
[viewControllers addObject:self];

ViewController* viewController1 = [[[ViewController alloc]
    initWithNibName:@"ViewController" bundle:nil] autorelease];
[viewControllers addObject:viewController1];

if (someCondition == YES)
{
    [viewControllers addObject:viewController2];
}

[self.navigationController
    setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES];