0

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

if(some condition)
    self.view = thisView;
else
    self.view = thatView;

但这没有用。我怎样才能做到这一点?

4

2 回答 2

1

内部-(void)loadView;方法是您创建视图的地方,因此您可以在其中有条件地设置它;)

于 2011-02-04T01:18:24.793 回答
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在插入新视图时删除旧视图。

于 2011-02-04T01:30:42.487 回答