我怎样才能展示一个独立的'查看控制器('忘记'前一个)

时间:2013-12-08 16:01:19

标签: ios objective-c cocoa-touch uiviewcontroller uinavigationcontroller

我有一个常规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有关的所有内容,但我不知道如何。

我对其他情况的解决方案持开放态度,但我也想回答一下如何在一般情况下提出另一种观点后完全“忘记”一种观点。

2 个答案:

答案 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");
}

我刚刚写了一些我之前解释过的示例逻辑,如果你觉得它适合你,你必须概括这个逻辑。希望它有所帮助:)