【问题标题】:What happens to my subView when changing navigation controllers?更改导航控制器时我的 subView 会发生什么?
【发布时间】:2012-02-27 23:45:23
【问题描述】:

假设我在视图中添加了一个子视图,如下所示:

[[self addSubview:myView];

然后我将一个新视图推送到 navigationController 堆栈上,如下所示:

[self.navigationController pushViewController:otherView animated:YES];

我添加到原始视图的子视图会发生什么。它会自动删除吗?

另外,如果我的程序调用这一行:

[[self addSubview:myView];

多次不删除视图是否会造成内存泄漏之类的坏事?

【问题讨论】:

    标签: iphone ios uiview


    【解决方案1】:

    首先,要更加小心你在说什么。您不向视图控制器添加子视图,而是向视图添加子视图,即(self 是视图控制器)

    [self.view addSubView:myView];
    

    另外,你不推送视图,而是视图控制器,即

    [self.navigationController pushViewController:otherViewController animated:YES];
    

    现在有了上面的第一条语句,视图就有了一个新的子视图。如果您通过navigationcontroller(第二条语句)将新视图推送到原始视图上,这不会真正影响原始视图。因此,在弹出新视图(控制器)后,您添加的子视图仍然存在。

    这样看:您的第一个视图控制器有一个名为 View1 的视图。您向 View1 添加了一个子视图,很好。现在,使用 UINavigationController 的推送将新视图 controller 推送到旧视图控制器上,因此您现在可以看到它的视图 View2。这与 View1 无关。

    要回答您的第二个问题,请参阅Add same subview multiple times to view

    简短的回答,视图将从父视图中删除并立即插入到父视图中。所以,虽然没有意义,但不会发生任何不好的事情(子视图只会被推到前面)。

    【讨论】:

    • 弹出后子视图可能不存在。如果您的应用收到内存警告,隐藏的视图控制器将清除其视图以释放 RAM。当再次调用 viewDidLoad 时,您应该准备重新创建和重新添加子视图。
    【解决方案2】:

    好吧,您总是可以使用 XCode 附带的测试工具包来检查内存泄漏,但我相信当您调用 pushViewController 时,它会保留另一个视图。此外,如果您使用 UINavigationController,它会自动放置一个漂亮的后退按钮,让您返回上一个视图。

    【讨论】:

      【解决方案3】:

      如果您调用[self.view addSubview: myView];,然后调用[self.navigationController pushViewController: otherViewController animated:YES];myView 不会自动从self.view 中删除。在不删除myView 的情况下多次调用[self.view addSubview: myView]; 似乎毫无意义,但不会造成内存泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        • 2015-06-14
        相关资源
        最近更新 更多