在导航堆栈中重新创建 viewController

Posted

技术标签:

【中文标题】在导航堆栈中重新创建 viewController【英文标题】:Recreate viewController in Navigation stack 【发布时间】:2013-08-11 12:34:06 【问题描述】:

我有某种情况想解决:

我有一个 UIViewController 可以加载。在某种情况下,我选择在导航堆栈的顶部显示一个新的UIViewController。之后,我想将之前的UIViewController 留在堆栈中,但我想对它进行排序release,所以当顶部的VC 弹出到第一个时,我会发现它不是我离开它的状态,但好像只是被推了一样。

尽管如此,我知道我可能只是想将它推送到第二个 VC 之上,但这会在导航堆栈中造成混乱,并且可能会导致内存泄漏,因为这种行为可能会被循环。

我正在使用 ARC 并为 ios 6 及更高版本构建应用程序。

【问题讨论】:

“重置”viewWillAppear 中的第一个 viewController 怎么样? @MartinR 那你怎么做呢?有什么方便的方法吗?我真的不想手动重新创建我在 viewDidLoad 方法中创建的所有内容。 【参考方案1】:

我认为你有两个选择:

    如果弹出第二个视图控制器,则在第一个视图控制器中调用 viewWillAppear 导航堆栈,因此您可以重置第一个视图的所有状态和 UI 元素 该方法中的控制器。 在弹出第二个视图控制器之前,您可以使用UINavigationControllersetViewControllers:animated: 方法将第一个视图控制器实例替换为导航堆栈中的新实例。

所以这取决于您是要保留第一个视图控制器实例并只是“重置”它,还是在返回时是否想要第一个视图控制器的“新鲜”实例 从第二个开始。

【讨论】:

【参考方案2】:

我建议您将通知从 2nd VC 发送到 1st VC,并告诉它卸载视图然后手动加载它:

第二个 VC:

- (void)viewWillAppear
   [[NSNotificationCenter defaultCenter]
   postNotificationName:@"unloadVC" object:nil];

第一个 VC

- (void)viewDidLoad
  [[NSNotificationCenter defaultCenter]addObserver:self 
                                          selector:@selector(unloadVC:) 
                                              name:@"unloadVC" 
                                            object:nil];


- (IBAction)unloadVC:(id)sender
self.view = nil;

[self viewDidLoad];

虽然代码没有经过测试。

【讨论】:

以上是关于在导航堆栈中重新创建 viewController的主要内容,如果未能解决你的问题,请参考以下文章

我在从导航堆栈中删除 ViewController 时遇到问题?

以编程方式从 ARC 中的导航堆栈中删除 viewController

如何从导航堆栈中删除 ViewController 并且没有返回到它的选项-Swift

有啥方法可以导航到 UInavigationcontroller 堆栈中间的 Viewcontroller

如何清除导航堆栈以使后退按钮不出现?

iOS在导航堆栈中的视图控制器之间循环