【问题标题】:set view property in a UIViewController from a NIB programmatically (not during initialization)以编程方式从 NIB 设置 UIViewController 中的视图属性(不在初始化期间)
【发布时间】:2009-02-13 21:15:34
【问题描述】:

在我的应用程序开始时,我正在使用 NIB 初始化 UIViewController。

在某些时候,我会从屏幕上移除视图,然后释放它,因此它不再占用内存。 (此时我也在UIViewController中保存视图的状态)

稍后,我想重新创建视图并将其重新显示在屏幕上。然后我将恢复它的状态。 (使用相同的 UIViewController,不是新的,因为它保存了状态)

我的问题是,当我重新创建视图时,如何从 NIB 执行此操作,或者这不可能?

对我来说,明显的补救措施是:

  1. 不要在 UIViewcontroller 中保存状态(约定在哪里要求我保存状态?)

  2. 不要释放视图(也许只释放它的所有子视图?)

  3. 不要从 NIB 加载我的视图,以编程方式创建(似乎不利于所有事情都使用 IB)

注意: 我没有使用 UINavigationController,我自己处理视图的交换,因为你只有 2 个。

【问题讨论】:

    标签: iphone cocoa-touch user-interface


    【解决方案1】:

    如果你需要那种级别的控制,你真的不想使用 IB。因为,正如您所指出的,如果删除视图然后重新创建它,那么无论如何您都必须在代码中执行此操作。只需在 IB 中设计大部分视图,然后编写一些代码来生成这个视图。然后,您可以稍后再次调用相同的方法,以便在需要时重新创建该视图。

    您也许可以将其存档,然后再将其重新转换为对象,但这似乎是一个不恰当的解决方案。 IB 不允许在运行时动态创建控件,即使它们曾经存在但不再存在。为此让 IB 脱离循环并不可耻。事实上,这可能是个好主意。


    或

    如果它是一个包含很多片段的复杂视图,请将视图放在它自己的 nib 中,并为其创建一个视图控制器。然后,您可以简单地使用 nib 名称创建视图控制器,并将控制器视图作为子视图添加到您的主视图中。然后你的视图控制器处理 nib 的加载,你可以在 IB 中设计它。也没有说视图控制器的视图必须占据整个屏幕。

    self.otherController = [[OtherController alloc] initWithNibName:@"Other" bundle:nil];
    [self.view addSubview:otherController.view];
    

    【讨论】:

      【解决方案2】:

      不要在同一个 nib 文件中创建视图控制器和视图;要么在代码中创建控制器,要么将视图放在单独的 nib 文件中。如果您稍后将控制器的视图属性设为 nil,则控制器应重新创建视图。

      但是你为什么这么担心呢?如果内存不足,已经有一种机制可以自动释放视图:内存不足警告。如果您确实需要这样做,它只会破坏并重新创建视图,并且它内置在系统中,因此您无需执行任何操作。还记得过早优化的说法吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        相关资源
        最近更新 更多