我使用UInavigationController的iPhone应用程序有问题。当我使用PushNavigationController时,它可以正常工作。 iPhone在切换到下一个ViewController时进行动画。但是,当使用viewControllers和SetViewControllers方法的数组时,它在动画中有一个小故障,可以成长为一个清晰可见的动画错误。

在root 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堆栈设置为Animation。如果我只添加第一个控制器,则可以正常工作。但是,在动画应转到第二控制器的情况下,导航栏的标题不会“飞行”。取而代之的是一个空的标题,直到动画完成为止。而且,更糟糕的是,如果我用自定义按钮替换Navbar标题,则此按钮将显示在左上角,直到动画完成。这是一个显示错误。

我尝试使用具有多个PushViewController方法的解决方法,但是动画看起来不正确。我希望导航以与PushViewController相同的方式进行动画。这里的唯一区别是,我不添加VC,而是一次设置整个堆栈。这里有其他解决方法,还是可以将其视为框架的错误?我考虑过仅将pushNavController用于VC2,然后以某种方式将VC1插入堆栈中,但这似乎不可能。

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

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

有帮助吗?

解决方案

最后,我找到了解决方案。错误是,在动画完成之前,新的顶级导航通行器尚未初始化和加载。就我而 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];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top