iPhone SDK,在运行时替换 XIB/NIB 文件 onViewDidAppear 或任何时间?

Posted

技术标签:

【中文标题】iPhone SDK,在运行时替换 XIB/NIB 文件 onViewDidAppear 或任何时间?【英文标题】:iPhone SDK, replace XIB/NIB file onViewDidAppear or anytime during runtime? 【发布时间】:2014-03-17 15:39:07 【问题描述】:

我有一个 iPhone/iPad 应用程序屏幕,其中包含我在两个界面构建器文件 (xib/nib) 中定义的两种可能布局。当应用程序启动时,我会查看 userdefaults 并选择加载哪一个。

但是,如果用户选择设置按钮并加载应用内设置菜单并更改布局,然后点击导航按钮返回上一个屏幕,我将如何将用户界面/xib 文件更改为新的选择不重启应用?

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用以下命令强制加载 XIB:

[[NSBundle mainBundle] loadNibNamed:@"XIBName" owner:self options:nil];

编辑

尝试以下方法:

在你可以在任何地方使用的实用程序类中添加以下内容。

+ (id)loadNibNamed:(NSString *)nibName ofClass:(Class)objClass 
    if (nibName && objClass) 
        NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName 
                                                         owner:nil 
                                                       options:nil];            
        for (id currentObject in objects )
            if ([currentObject isKindOfClass:objClass])
                return currentObject;
        
    

    return nil;

然后像这样拨打电话:

MyClass *myClassInstance = [Utility loadNibNamed:@"the_nib_name" 
                                         ofClass:[MyClass class]];

另请参阅:Single View controller with multiple nibs?

【讨论】:

这将允许我继续使用相同的视图控制器文件? 我必须在之后调用 [self viewDidLoad] 吗? 是的,您将不知何故需要再次加载视图,或者必须将视图作为子视图添加到某些父视图。 我刚刚尝试过这样做,但没有得到任何结果。我已经将该行添加到我的 viewdidappear 方法中,然后在它之后添加 [self viewDidLoad] 并且没有任何事情发生。我的旧视图仍在屏幕上,功能相同。 您在通话中的示例将其放入类变量中。我将如何使用它来切换当前视图控制器的视图?为了澄清我已经在应用程序委托中创建了视图控制器,并且我在具有默认视图的视图控制器中。如果我想改变布局而不改变控制器,我认为我不需要创建一个新的视图控制器类,我觉得我可以直接改变笔尖。【参考方案2】:
MyUIViewController *controller;
if (IS_IPAD)
  controller = [[MyUIViewController alloc] initWithNibName:@"MyUIViewController_iPad" bundle:nil];
 else 
  controller = [[MyUIViewController alloc] initWithNibName:@"MyUIViewController_iPhone" bundle:nil];

例如,您可以从导航控制器推送

[self.navigationController pushViewController:controller animated:YES];

【讨论】:

这会取代笔尖并保持视图控制器不变吗?有点像动态布局

以上是关于iPhone SDK,在运行时替换 XIB/NIB 文件 onViewDidAppear 或任何时间?的主要内容,如果未能解决你的问题,请参考以下文章

将项目从 XIB/NIB 移动到 Storyboards

NIB/XIB 中的 StackView 约束行为是不是不同?

如何在框架内加载 `.xib` / `.nib` 文件?

我可以在通用应用程序中制作一个可以在 iPhone 和 iPad UI 之间共享的 XIB/NIB 吗?

在 iOS 上反编译或解释 XIB/NIB 文件

MainWindow.xib nib 文件有啥用?