我有一个使用 iOS 5 和 Xcode 4.3.2 的 iOS 应用程序,它由 7 个视图控制器组成。VC1 链接到 VC2,VC2 可以链接到 VC3-VC7,并且这些控制器中的每一个都可以相互链接(将其视为侧边栏导航)。如果我使用 segues,视图会重复添加到堆栈中,并且如果用户来回移动它可能会使用大量内存。如何在释放前一个控制器的地方实现此导航?它们都是小型控制器,因此加载它们需要很少的时间/处理器/内存。我可以先presentViewController,然后以某种方式释放presentingViewController吗?谢谢。
3 回答
如果你实现了一个 UINavigationController,你可以使用 push 和 pop 视图控制器方法来回切换。 此处描述了popToViewController:animated:以及其他 3 个有用的方法。
看来从 VC1 到 VC2 应该没有问题。对于 VC3 - VC7,您可以:
- 呈现为 modalViewController 而不是将其推送到堆栈。
或者: - 如果控制器已经存在于控制器堆栈中,则使用 UINavigationController 的 popToViewController:animated: 函数,否则推送它。像
// Assuming u need to push VC6
for(UIViewController *controller in [urNavController viewControllers]){
if([controller isKindOfClass:[VC6 class]])
{
[urNavController popToViewController:controller animated:YES];
}
else{
VC6 *VC6controller = [[VC6 alloc] init];
[urNavController pushViewController:VC6controller];
}
}
您可以使用UINavigationController
'- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
方法删除最上面的任何视图控制器。由于导航控制器的viewControllers
数组是不可变的,因此您不能直接在数组上使用任何NSMutableArray
's方法。您必须将 a制成一个可变数组,从可变数组中删除您希望丢弃的任何(隐藏)视图控制器,并将生成的精简视图控制器堆栈传递给上述方法。由于您的最顶层视图控制器将保持不变,因此在您的情况下将没有过渡动画(请参见下面的讨论),因此您也可以直接设置 viewControllers 属性而无需打扰参数。removeObject...
viewControllers
mutableCopy
animated:
来自 Apple 的文档:
讨论 您可以使用此方法更新或替换当前视图控制器堆栈,而无需显式推送或弹出每个控制器。此外,此方法允许您在不为更改设置动画的情况下更新控制器集,当您希望将导航控制器返回到以前的状态时,这可能适用于启动时。
如果启用了动画,此方法会根据 items 数组中的最后一项是否已经在导航堆栈中来决定执行哪种类型的转换。如果视图控制器当前在堆栈中,但不是最顶部的项目,则此方法使用弹出过渡;如果它是最顶层的项目,则不执行转换。如果视图控制器不在堆栈上,则此方法使用推送转换。只执行一次转换,但当该转换完成时,堆栈的全部内容将被新的视图控制器替换。例如,如果控制器 A、B 和 C 在堆栈上,并且您设置了控制器 D、A 和 B,则此方法使用弹出转换,并且生成的堆栈包含控制器 D、A 和 B。