在导航堆栈中重新创建 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 元素
该方法中的控制器。
在弹出第二个视图控制器之前,您可以使用UINavigationController
的setViewControllers: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