我有一个使用iOS 5和Xcode 4.3.2的iOS应用程序,它由7个视图控制器组成。 VC1链接到VC2,VC2可以链接到VC3-VC7,每个控制器可以相互链接(将其视为侧栏导航)。如果我使用segues,则会将视图重复添加到堆栈中,如果用户来回移动,则可以使用大量内存。如何在我发布以前的控制器的位置实现此导航?它们都是小型控制器,因此加载它们需要很少的时间/处理器/内存。我可以提交ViewController,然后以某种方式释放presentViewController吗?感谢。
答案 0 :(得分:1)
如果实现UINavigationController,则可以使用push和pop视图控制器方法来回传递。此处描述了popToViewController:animated:以及其他3种有用的方法。
答案 1 :(得分:1)
好像从VC1到VC2应该没问题。对于VC3-VC7,您可以:
或者: - 如果Controller已存在于控制器堆栈中,请使用popToViewController:animated:UINavigationController的函数,否则将其推送。像
// 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];
}
}
答案 2 :(得分:0)
您可以使用UINavigationController
的{{1}}方法删除最顶层视图控制器下面的任何视图控制器。由于导航控制器的- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
数组是不可变数组,因此您无法直接在viewControllers
数组上使用任何NSMutableArray
的{{1}}方法。您必须将removeObject...
转换为可变数组,从可变数组中删除您希望丢弃的任何(隐藏)视图控制器,并将生成的精简视图控制器堆栈传递给上述方法。由于您的最顶层视图控制器将保持不变,因此在您的情况下不会有转换动画(请参阅下面的讨论),因此您也可以直接设置viewControllers属性而不必费心使用viewControllers
参数。
来自Apple的文档:
讨论 您可以使用此方法更新或替换当前视图控制器堆栈,而无需显式推送或弹出每个控制器。此外,此方法允许您更新控制器集,而无需设置更改动画,这可能在您希望将导航控制器返回到先前状态时在启动时适当。
如果启用了动画,则此方法根据items数组中的最后一项是否已在导航堆栈中来决定执行哪种类型的转换。如果视图控制器当前在堆栈中,但不是最顶层的项,则此方法使用弹出过渡;如果它是最顶层的项目,则不执行转换。如果视图控制器不在堆栈中,则此方法使用推送转换。仅执行一次转换,但是当转换完成时,堆栈的全部内容将替换为新的视图控制器。例如,如果控制器A,B和C位于堆栈上并且您设置了控制器D,A和B,则此方法使用弹出转换,结果堆栈包含控制器D,A和B.