我想在运行时设置UIViewController的view属性。我有一个带有两个视图的.xib文件,我希望我的UIViewController子类拥有.xib文件来决定在运行时使用哪个UIView。我以为我只需要说
就可以在loadView中执行此操作if(some condition)
self.view = thisView;
else
self.view = thatView;
但这不起作用。我怎么能这样做?
答案 0 :(得分:1)
内部-(void)loadView;
方法是您创建视图的位置,因此您可以根据需要有条件地设置它;)
答案 1 :(得分:1)
如果要动态选择视图,请在-[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
时删除旧的{{1}}。 / p>