0

例如:

  1. 使用 initWithNibName 创建一个新的 UIVC,使用“nib-v1”
  2. 显示它,例如使用 [(UINavigationController) nav pushViewController: myVC]
  3. 将 myVC 使用的 NIB 更改为“nib-v2”

据我所知,这是许多应用程序的“正确”应用程序设计方法,在分页信息时,您需要两个稍微不同的 UI 屏幕来显示信息。

例如,您的大多数页面都是文本,但其中一些也有图像(想想 RSS 阅读器,其中一些 RSS 条目有文本 + 图像,一些只有文本)。

我之前处理过这个问题,方法是让一个 NIB 文件带有第二个不可见的命名 UIView 实例,我在第一个实例的顶部分层,并根据上下文使用“隐藏”标志打开/关闭。

但这显然是错误的,并且浪费了内存。

但是,我看不到从 NIB 文件“重新加载”视图的明显方法。我猜我想以某种方式重现 initWithNibName 的魔力?

我怀疑这是可能的,但我敢肯定,如果你以“错误的方式”进行操作,那么应用程序将会严重崩溃。

4

5 回答 5

7

你可以随时执行

[[NSBundle mainBundle] loadNibNamed:@"FileName" owner:viewController options:nil]];

但这无疑会使事情变得一团糟,如果您不确定自己在做什么,尤其是如果view在这两个笔尖中都连接了

您应该重新设计视图控制器层次结构以在从两个不同 nib 文件加载的两个不同控制器之间进行交换。


或者,您可以让控制器管理它从与它无关的不同文件加载的交换视图nibName。在这种情况下,您可以按上述方式加载它们。并且您将希望将它们的插座(例如,subviewOnesubviewTwo)连接到不同的笔尖。

于 2011-09-15T01:37:12.523 回答
4

您应该查看 UINib 类,看看它是否符合您的要求。它将允许您加载 nib 文件并将其保存在内存中。

但只是为了澄清:你想修改 nib 文件本身吗?或者你想在 nib 文件加载到内存后修改它的内容?

在我的脑海中,第一个会非常困难(你不能修改原始文件,因为它是应用程序包的一部分......也许你将它复制到 Documents 文件夹并编写你自己的编码器/解码器?)第二个更容易,但我不确定原因是什么?为什么不只是在加载后修改 viewController/view(例如,在 awakeFromNib 中),如果您希望这些更改持续存在,请在之后将这些更改保存到文件中。

简而言之,我不确切知道您想做什么,但在我看来,可能有更好的方法来做这件事。

于 2011-09-15T01:35:07.867 回答
2

NSBundle我同意 Rob 的观点,但如果你真的想搞乱交换笔尖(这很糟糕,因为它很容易导致悬空指针等),你可以使用's方法从新笔尖加载视图- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options并执行视图换自己。

您应该对不同类型的内容使用不同的视图控制器。如果它们只是略有不同,您仍然可以考虑创建一个基类并将不同的变体子类化。

于 2010-01-06T23:13:47.407 回答
0

我来寻找相同问题的答案,并最终像这样解决它:

UIViewController* ctrler = [[UIViewController alloc] initWithNibName:@"NewControllerNIB" bundle:nil];

// Replace previous controller with the new one
UINavigationController* nav = self.navigationController;
[nav popViewControllerAnimated:NO];
[nav pushViewController:ctrler animated:NO];

我不确定当前控制器是否有可能在执行推送新控制器的调用之前被释放,但到目前为止它似乎有效(直到我用更好的方法重新设计应用程序)

于 2012-04-03T21:05:24.663 回答
0

您不应更改 UIViewController 使用的 NIB 文件。将 NIB 附加到 UIViewController 应该是一次性事件。隐藏的视图很好;他们当然没有明显错误。您还可以在加载后以编程方式添加视图元素。如果你做了很多这样的事情,你可以完全跳过 NIB 并以编程方式在-loadView. 这些都可以,但初始化后不要切换NIB。我什至不建议为给定的 UIViewController 类选择多个 NIB;这太令人困惑了。通常,每个 NIB 都应映射到具有非常相似(或相同)名称的专用 UI​​ViewController 类。

在相关说明中,我建议将 NIB 的名称移动到 UIViewController 中,如之前的帖子中所述。

于 2010-01-06T23:05:31.280 回答