gpt4 book ai didi

objective-c - 在 iPhone 上使用 UINavigationController 的 setViewController 行为不正常

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:20 24 4
gpt4 key购买 nike

我在使用 UINavigationController 的 iPhone 应用程序时遇到问题。当我使用 pushNavigationController 时,它工作正常。 iPhone 在切换到下一个 ViewController 时执行其动画。但是,当使用 ViewController 数组和 setViewControllers 方法时,它会在动画中出现一个故障,该故障可能会发展成一个清晰可见的动画错误。

以下代码片段在根 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 堆栈。如果我只添加第一个 Controller ,这将正常工作。但是在动画应该转到第二个 Controller 的情况下,导航栏的标题不会是“飞入”。取而代之的是一个空标题,直到动画结束。而且,更糟糕的是,如果我用自定义按钮替换导航栏标题,这个按钮将显示在左上角,直到动画结束。这是一个相当大的显示错误。

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

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

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

最佳答案

终于找到了解决办法。错误是在动画完成之前,新的顶级 NavigationController 尚未初始化和正确加载。在我的例子中,UserAssignmentsListViewController 有一个 viewDidLoad 方法,在动画完成之前不会调用该方法,但它会设置导航标题(此处为 UIButton)。因此动画失败。

解决方案是在将它插入堆栈时引用一个已经初始化的 View Controller 。所以在某处初始化我们的顶级 VC:

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

然后,当将两个或多个 VC 插入堆栈时,顶层的 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];

关于objective-c - 在 iPhone 上使用 UINavigationController 的 setViewController 行为不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4346116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com