Ios 我如何呈现一个';独立';视图控制器(忘记上一个)

Ios 我如何呈现一个';独立';视图控制器(忘记上一个),ios,objective-c,cocoa-touch,uiviewcontroller,uinavigationcontroller,Ios,Objective C,Cocoa Touch,Uiviewcontroller,Uinavigationcontroller,我有一个常规的UINavigationController,附带了几个视图,它们工作得非常好。它的RootViewController在左上角有一个自定义菜单按钮,与附加视图上的“后退”按钮位于同一位置。单击此菜单按钮时,将显示菜单并显示五个选项。 显然,通过单击其中一个选项,您将看到该选项的ViewController 我想完全“忘记”当前的ViewController,然后转到这个新的控制器。通常,我会做一些类似于[self-presentViewController….]或[self.na

我有一个常规的
UINavigationController
,附带了几个视图,它们工作得非常好。它的
RootViewController
在左上角有一个自定义菜单按钮,与附加视图上的“后退”按钮位于同一位置。单击此菜单按钮时,将显示菜单并显示五个选项。 显然,通过单击其中一个选项,您将看到该选项的ViewController

我想完全“忘记”当前的ViewController,然后转到这个新的控制器。通常,我会做一些类似于
[self-presentViewController….]
[self.navigationController push..],但在这些方法中,我认为当前的ViewController将始终存在于新的演示ViewController的“下方”(因为如果使用
[self dismissViewController..”;
,您将返回此实例化,我不希望这样)

在显示的ViewController中,将有一个菜单选项返回到原始控制器,但我仍然希望它是一个干净的实例化,而不仅仅是弹出。通过提前思考,我想我可能会使用我知道的这种方法,在每个视图控制器之上创建无限多个视图控制器

在ARC时代开始后,我进入了iOS的世界,因此我不知道如何发布或释放这些观点,我认为这些观点与此相关

第二个视图控制器也应该是UINavigationController中的根,我不确定是否最好使用同一个UINavigationController,或者我是否应该提供一个新的,并忽略旧的。基本上,我想从
rootViewController
替换导航控制器的
rootViewController
,但我不知道这是怎么可能的。或者可能按下ViewController2,然后将rootViewController从层次结构中弹出,将新的ViewController保留为根,但我认为导航后退按钮会出现问题(如果可能的话)

我认为让ViewController2在其自己的NavigationController上成为根用户同样容易,并从ViewController1中呈现这个NavigationController。问题是,在演示ViewController2之后,我想从内存中完全删除与ViewController1及其NavigationController有关的所有内容,但我不知道如何操作


对于我的情况,我愿意接受其他解决方案,但我也想知道如何在一般情况下展示另一个视图后完全“忘记”一个视图。

创建一个菜单
UIViewController
,并在启动时将其作为根添加到
UINavigationController
。调用菜单控制器的
viewDidLoad
时,将第一个
UIViewController
作为子控制器添加到菜单
UIViewController
。当您单击菜单显示第二个
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的解除锁定

-(void)dealloc{

    NSLog(@"first vc released");
}

我只是写了一些我之前解释过的示例逻辑,如果你觉得这个逻辑对你合适的话,你必须推广它。希望有帮助:)

创建一个菜单
UIViewController
,并在启动时将其作为根目录添加到
UINavigationController
。调用菜单控制器的
viewDidLoad
时,将第一个
UIViewController
作为子控制器添加到菜单
UIViewController
。当您单击菜单显示第二个
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的解除锁定

-(void)dealloc{

    NSLog(@"first vc released");
}
我只是写了一些我之前解释过的示例逻辑,如果你觉得这个逻辑对你合适的话,你必须推广它。希望它有帮助:)

如果你想“忘记”控制器,你可以用一个新的来替换窗口的根视图控制器。如果您没有任何其他指向它的强指针,那么原始的一个将被释放。我不确定我是否完全理解您试图执行的操作,但例如,如果您希望控制器1和控制器2都是导航控制器的根视图控制器,并且在切换到2时不希望控制器1出现,请从控制器1执行类似的操作:

SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:second];
self.view.window.rootViewController = nav;
这将关闭控制器,控制器1及其导航控制器将被解除分配(假设只有窗口通过其rootViewController属性具有指向导航控制器的强指针)。

如果要“忘记”控制器,您可以用新的根视图控制器替换窗口的根视图控制器。如果您没有任何其他指向它的强指针,那么原始的一个将被释放。我不确定我是否完全理解您试图执行的操作,但例如,如果您希望控制器1和控制器2都是导航控制器的根视图控制器,并且在切换到2时不希望控制器1出现,请从控制器1执行类似的操作:

SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:second];
self.view.window.rootViewController = nav;

这将关闭控制器,控制器1及其导航控制器将被解除分配(假设只有窗口通过其rootViewController属性具有指向导航控制器的强指针)。

<