【问题标题】:Does dismissViewControllerAnimated remove the controller's instancedismissViewControllerAnimated 是否删除控制器的实例
【发布时间】:2013-01-19 08:12:38
【问题描述】:

对于我的应用,我想拥有同一个视图控制器的几个不同实例。现在,我只是像这样创建一个新实例:

iSafeViewController *tab = [[iSafeViewController alloc] init];

[tab setModalPresentationStyle:UIModalPresentationFullScreen];
[tab setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];

[self presentViewController:tab animated:YES completion:nil];

太好了。而且由于无论如何这都是在 iSafeViewController 类中完成的,所以我有另一个按钮,当前只是关闭堆栈上的最新控制器。

 - (IBAction)closeTab:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
 }

好的,但是,我真的希望能够回到这些实例。所以,我有两个问题。

  1. dismissViewControllerAnimated 是否从内存中删除该控制器的实例。如果没有,有没有办法让我重新呈现它。

  2. 可能有比presentViewControllerAnimated 更好的方式来浏览viewController 实例。至少,有没有更好的方法来创建一个视图控制器的新实例并能够导航到每个实例,希望不在堆栈中。换句话说,如果有三个 viewController 实例,有没有办法可以从第三个转到主实例?

任何想法将不胜感激。谢谢。

【问题讨论】:

    标签: objective-c cocoa-touch oop instance multiple-instances


    【解决方案1】:

    dismissViewControllerAnimated 是否从内存中删除了该控制器的实例?如果没有,我有办法重新呈现它。”

    调用dismissViewControllerAnimated 不会显式地从内存中删除视图控制器,但如果代码的其他部分没有存储对视图控制器的强引用,一旦呈现的视图控制器关闭您的 VC,它可能会被释放正常的内存管理系统。

    因此,如果您确保代码中的某些内容引用了您的视图控制器(除了以模态方式呈现它的 VC 之外),它在被解除后不会消失,是的,这意味着您可以重复使用它。

    对于视图控制器的“随机访问”:您可以使用UINavigationController 并使用popToViewController:animated: 之类的方法以及多次调用pushViewController:animated:(没有动画!)来创建效果前往任意视图控制器。 这感觉有点像 hack。

    另外,最好是,您可以编写自己的自定义容器视图控制器。这是一个处理呈现其他视图控制器的视图控制器。见Apple docs

    这是一个很好的 WWDC 视频:Implementing UIViewController Containment

    进一步阅读:

    【讨论】:

    • 很好,但我怎么会回来。我最终创建了一个类来存储这些控制器的所有实例。但是,如果我尝试使用`presentViewController:selectedItem`,它会抛出一个异常,说明我正在尝试呈现一个已经处于活动状态的viewController。我怎样才能回到控制器,定义为selectedItem 有没有presentViewControllerAnimated 的替代品?
    • 我会停止使用模态呈现的视图控制器并考虑编写一个简单的容器视图控制器——请参阅我上面链接到的文章。
    • 感谢您的帮助。我会试试这个。
    猜你喜欢
    • 2015-09-04
    • 2016-08-23
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多