代码之家  ›  专栏  ›  技术社区  ›  Adam

你能把NIB文件换成已经在屏幕上的uiviewcontroller吗?

  •  0
  • Adam  · 技术社区  · 15 年前

    例如:

    1. 使用initwithnibname,使用“nib-v1”创建新的uivc
    2. 显示它,例如使用[(uinavigationcontroller)nav pushviewcontroller:myvc]
    3. 将myvc使用的NIB更改为“NIB-V2”

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

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

    我之前已经处理过这个问题,我将一个NIB文件与另一个名为uiview的不可见实例放在一起,该实例位于第一个实例的顶部,并使用“hidden”标志根据上下文打开/关闭。

    但这显然是错误的,浪费了记忆。

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

    我怀疑这是可能的,但我敢肯定,如果你做的“错误的方式”,那么应用程序将完全崩溃可怕。

    5 回复  |  直到 12 年前
        1
  •  2
  •   MrMage    15 年前

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

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

        2
  •  7
  •   bshirley RoxJ    13 年前

    你可以一直表演

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

    但这无疑会 把事情搞砸了 如果你不确定自己在做什么,尤其是如果 view 两个笔尖相连

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


    或者,您可以让控制器管理它从与它无关的不同文件加载的交换视图。 nibName .在这种情况下,您可以用上述方式加载它们。你会想拥有他们的销售渠道(例如, subviewOne subviewTwo )连接在不同的笔尖上。

        3
  •  4
  •   Matthew Gillingham    13 年前

    您应该检查uinib类,看看它是否满足您的需要。它允许您加载一个NIB文件并将其保存在内存中。

    但要澄清的是:您想修改NIB文件吗? 它本身 ?或者您想在NIB文件加载到内存时修改其内容?

    从我的头上看,第一个非常困难(您不能修改原始文件,因为它是应用程序包的一部分……也许您可以将其复制到文档文件夹并编写自己的编码器/解码器?)第二个更容易,但我不知道原因是什么?为什么不在加载后(例如,在awakefromnib中)修改viewcontroller/view,如果希望这些更改保持不变,请在以后将这些更改保存到文件中。

    简言之,我不知道你到底想做什么,但我觉得机会很大,也许有更好的方法。

        4
  •  0
  •   Community paulsm4    7 年前

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

    在相关注释中,我建议将NIB的名称移动到uiviewController中,如 earlier posting .

        5
  •  0
  •   inolasco    12 年前

    我来找同一个问题的答案,结果就这样解决了:

    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];
    

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