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 或任何时间?的主要内容,如果未能解决你的问题,请参考以下文章
NIB/XIB 中的 StackView 约束行为是不是不同?