Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在哪里可以指定哪个UIView用于UIViewController的view属性?_Iphone_Ios_Uiview_Uiviewcontroller_Loadview - Fatal编程技术网

Iphone 在哪里可以指定哪个UIView用于UIViewController的view属性?

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方法是您创建视图的地方,因此您需要在其中有条件地

我想在运行时设置UIViewController的view属性。我有一个包含两个视图的.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;
}
- (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文件中选择几个视图中的一个,我已经更新了答案,以显示更好的方法。