我想在运行时设置 UIViewController 的视图属性。我有一个带有两个视图的 .xib 文件,我希望拥有 .xib 文件的 UIViewController 子类决定在运行时使用哪个 UIView。我以为我可以在 loadView 中做到这一点,只需说
if(some condition)
self.view = thisView;
else
self.view = thatView;
但这没有用。我怎样才能做到这一点?
我想在运行时设置 UIViewController 的视图属性。我有一个带有两个视图的 .xib 文件,我希望拥有 .xib 文件的 UIViewController 子类决定在运行时使用哪个 UIView。我以为我可以在 loadView 中做到这一点,只需说
if(some condition)
self.view = thisView;
else
self.view = thatView;
但这没有用。我怎样才能做到这一点?
内部-(void)loadView;
方法是您创建视图的地方,因此您可以在其中有条件地设置它;)
如果要动态选择视图,请将其设置在-[UIViewController loadView]
. 不过要注意:如果视图尚未加载,调用-[UIViewController view]
将调用,所以如果你这样做:-[UIViewController loadView]
-(void)loadView
{
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
self.view.backgroundColor = [UIColor redColor];
}
该方法的第二行将调用-loadView
,您将获得无限递归(这将导致堆栈溢出和崩溃)。您需要设置视图,然后在设置好后设置.view
属性,如下所示:
-(void)loadView
{
UIView *newView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
newView.backgroundColor = [UIColor redColor];
self.view = newView;
}
所以你可能想做这样的事情:
-(void)loadView
{
UIView *newView = nil;
if (self.theSkyIsBlue) {
newView = [[[BlueSkyView alloc] initWithFrame:CGRectZero] autorelease];
newView.backgroundColor = [UIColor blueColor];
}
else {
newView = [[[GraySkyView alloc] initWithFrame:CGRectZero] autorelease];
newView.backgroundColor = [UIColor grayColor];
}
self.view = newView;
}
附录 1 - 更新以显示如何将容器视图用于 XIB 中定义的不同视图
如果您想在您的 XIB 中引用其他内容,更好的方法是使用您的 .view 作为其他视图的“容器视图”。在 中进行设置-viewDidLoad
,如下所示:
- (void)viewDidLoad
{
UIView *childView = nil;
if (someCondition) {
childView = self.blueView;
}
else {
childView = self.grayView;
}
[self.view addSubview:childView];
childView.frame = self.view.bounds;
}
请注意,如果您想稍后交换视图,您应该创建childView
一个属性,而不是局部变量,这样您就可以childView
在插入新视图时删除旧视图。