我有一个常规UINavigationController
附加了几个视图,这些视图完全正常。它的RootViewController
左上方有一个自定义菜单按钮,与“后退”按钮位于附加视图的同一位置。单击此菜单按钮时,将出现菜单并显示五个选项。
显然,通过单击其中一个选项,您将看到该选项的ViewController。
我想完全“忘记”当前的ViewController,然后继续使用这个新的控制器。通常,我会做类似[self presentViewController....];
或[self.navigationController push..];
的事情,但在这些方法中,我认为当前的ViewController将始终存在于新呈现的viewController“下方”(如果使用的话,您将返回此实例化) [self dismissViewController..];
,我不希望这样。)
在呈现的ViewController中会有一个菜单选项返回原始控制器,但我仍然希望这是一个干净的实例,而不仅仅是弹出。通过及时思考,我想通过使用我所知道的方法,我可能会在彼此之上创建无限数量的ViewControllers。
在ARC开始的时代之后,我进入了的世界,所以我不知道如何发布或取消分配这些视图,我认为这些视图在这里具有相关性。
第二个View Controller也应该是UINavigationController中的一个根,我不确定是否最好使用相同的UINavigationController,或者我是否应该提供一个新的,并解雇旧的。基本上,我想从rootViewController
替换导航控制器的rootViewController
,但我不知道如何做到这一点。或者可能推送到ViewController2,然后将rootViewController从层次结构中弹出,将新的ViewController保留为根,但我认为我的导航后退按钮有问题(如果可能的话)。
我认为让ViewController2成为自己的NavigationController根,并从ViewController1呈现这个NavigationController同样容易。问题是,我想在呈现ViewController2之后从内存中完全删除与ViewController1及其NavigationController有关的所有内容,但我不知道如何。
我对其他情况的解决方案持开放态度,但我也想回答一下如何在一般情况下提出另一种观点后完全“忘记”一种观点。
答案 0 :(得分:4)
如果你想“忘记”控制器,你可以用一个新的控制器替换窗口的根视图控制器。如果您没有任何其他强有力的指针,原始的将被解除分配。我不确定我是否理解你要做的所有事情,但是例如,如果你想让控制器1和控制器2都成为导航控制器的根视图控制器,并且你不希望控制器1在你切换到2,然后从控制器1做这样的事情:
SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:second];
self.view.window.rootViewController = nav;
这将关闭控制器,控制器1及其导航控制器将被解除分配(假设唯一具有指向导航控制器的强指针是窗口,通过其rootViewController属性)。
答案 1 :(得分:1)
创建一个菜单UIViewController
,并在启动时将其作为根添加到UINavigationController
。当调用菜单控制器的UIViewController
时,将第一个UIViewController
作为子控制器添加到菜单viewDidLoad
。当您单击菜单以显示第二个UIViewController
时,从菜单视图控制器中删除第一个UIViewController
并将第二个UIViewController
添加到菜单视图控制器的子项。您可以将NSLog
放在第一个和第二个视图控制器的dealloc
方法中,以检查它是否已释放。逻辑是这样的
//在menuvc类
中@interface MenuVC{
UIViewController * currentVC; // current child controller to menuVC
}
-(void)viewDidLoad{
[self addChildController:firstVC]; //to add view controller 1 intially
currentVC = firstVC;
}
-(void)add2ndChildController{
[currentVC removeFromParentViewController];
[self addChildController:secondVC]; //to add view controller 2 when needed
currentVC = secondVC;
}
//第一个vc的dealloc
-(void)dealloc{
NSLog(@"first vc released");
}
我刚刚写了一些我之前解释过的示例逻辑,如果你觉得它适合你,你必须概括这个逻辑。希望它有所帮助:)