以编程方式从NIB设置UIViewController中的视图属性(不在初始化期间)

时间:2009-02-13 21:15:35

标签: iphone cocoa-touch user-interface

在我的应用程序的开头,我正在初始化一个带有NIB的UIViewController。

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

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

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

对我来说,显而易见的补救措施是:

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

  2. 不要发布视图(可能只是发布所有子视图?)

  3. 不要从NIB加载我的视图,以编程方式创建(似乎反对使用IB来处理所有事情)

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

2 个答案:

答案 0 :(得分:2)

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

您可以将其存档,然后将其转换回对象,但这似乎是一个不起眼的解决方案。 IB不允许在运行时动态创建控件,即使它们曾经存在但不再存在。将IB留在循环中是没有羞耻的。事实上,这可能是一个好主意。


OR

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

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

答案 1 :(得分:0)

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

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