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

时间:2011-02-04 01:15:17

标签: iphone ios uiview uiviewcontroller loadview

我想在运行时设置UIViewController的view属性。我有一个带有两个视图的.xib文件,我希望我的UIViewController子类拥有.xib文件来决定在运行时使用哪个UIView。我以为我只需要说

就可以在loadView中执行此操作
if(some condition)
    self.view = thisView;
else
    self.view = thatView;

但这不起作用。我怎么能这样做?

2 个答案:

答案 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>