在我的应用程序的开头,我正在初始化一个带有NIB的UIViewController。
在某些时候,我正在从屏幕上删除视图,然后释放它,因此它不再占用内存。 (此时我还在UIViewController中保存视图的状态)
稍后,我想重新创建视图并将其重新显示在屏幕上。然后我会恢复它的状态。 (使用相同的UIViewController,而不是新的,因为它保存了状态)
我的问题是,当我重新创建视图时,如何从NIB中执行此操作,或者这是不可能的?
对我来说,显而易见的补救措施是:
不要在UIViewcontroller中保存状态(约定在哪里指示我保存状态?)
不要发布视图(可能只是发布所有子视图?)
不要从NIB加载我的视图,以编程方式创建(似乎反对使用IB来处理所有事情)
注意: 我没有使用UINavigationController,我正在处理自己的视图交换,因为你只有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文件中。如果您稍后将控制器的视图属性取消,则控制器应重新创建视图。
但你为什么这么担心呢?如果内存不足,已经有一种自动释放视图的机制:内存不足警告。如果您确实需要这样做,它只会销毁并重新创建视图,并且它内置于系统中,因此您无需执行任何操作。还记得关于过早优化的说法吗?