Iphone 在哪里可以指定哪个UIView用于UIViewController的view属性?
我想在运行时设置UIViewController的view属性。我有一个包含两个视图的.xib文件,我希望拥有.xib文件的UIViewController子类决定在运行时使用哪个UIView。我想我可以在loadView中通过说Iphone 在哪里可以指定哪个UIView用于UIViewController的view属性?,iphone,ios,uiview,uiviewcontroller,loadview,Iphone,Ios,Uiview,Uiviewcontroller,Loadview,我想在运行时设置UIViewController的view属性。我有一个包含两个视图的.xib文件,我希望拥有.xib文件的UIViewController子类决定在运行时使用哪个UIView。我想我可以在loadView中通过说 if(some condition) self.view = thisView; else self.view = thatView; 但那没用。我如何才能做到这一点?内部-(void)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;
}
- (void)viewDidLoad
{
UIView *childView = nil;
if (someCondition) {
childView = self.blueView;
}
else {
childView = self.grayView;
}
[self.view addSubview:childView];
childView.frame = self.view.bounds;
}
所以你可能会想做这样的事情:
-(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;
}
- (void)viewDidLoad
{
UIView *childView = nil;
if (someCondition) {
childView = self.blueView;
}
else {
childView = self.grayView;
}
[self.view addSubview:childView];
childView.frame = self.view.bounds;
}
附录1-更新以显示如何对XIB中定义的不同视图使用容器视图
如果您想引用XIB中的其他内容,更好的方法是使用.view作为其他视图的“容器视图”。在-viewDidLoad
中设置它,如下所示:
-(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;
}
- (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
。我应该提到,这两个视图是视图控制器的xib文件的一部分。这样不行吗?如果您想从视图控制器的XIB文件中选择几个视图中的一个,我已经更新了答案,以显示更好的方法。