我在哪里可以指定哪个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视图的地方,所以有条件地设置它;)