我在哪里可以指定哪个UIView用于UIViewController的视图属性?

我想在运行时设置一个UIViewController的视图属性。 我有一个.xib文件和两个视图,我想我的UIViewController子类拥有.xib文件来决定在运行时使用哪个UIView。 我以为我可以在loadView中做到这一点,只是说

if(some condition) self.view = thisView; else self.view = thatView; 

但是这并没有奏效。 我怎样才能做到这一点?

如果你想dynamic地select你的视图,在里面设置它-[UIViewController loadView] 。 尽pipe如此,一个警告:调用-[UIViewController view]将调用-[UIViewController loadView]如果视图尚未加载,所以如果你这样做:

 -(void)loadView { self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; self.view.backgroundColor = [UIColor redColor]; } 

该方法的第二行将调用-loadView ,你会得到无限recursion(这将导致堆栈溢出和崩溃)。 您需要设置您的视图,然后设置.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属性而不是本地variables,以便在插入新的子childView时删除旧的子childView

里面-(void)loadView; 方法就是创build视图的地方,所以有条件地设置它;)