0

実行時に UIViewController のビュー プロパティを設定したいと考えています。2 つのビューを持つ .xib ファイルがあり、.xib ファイルを所有する UIViewController サブクラスで、実行時に使用する UIView を決定します。と言うだけで、loadViewでこれを実行できると思いました

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

しかし、それはうまくいきませんでした。これどうやってするの?

4

2 に答える 2

1

ビューを動的に選択する場合は、 内に設定します-[UIViewController loadView]。ただし、ビューがまだロードされていない場合、呼び出し-[UIViewController view]は呼び出されるため、次のようにすると次のようになります。-[UIViewController loadView]

-(void)loadView
{
    self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
    self.view.backgroundColor = [UIColor redColor];
}

そのメソッドの 2 行目で が呼び出さ-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 に答える
1

内部-(void)loadView;メソッドはビューを作成する場所なので、条件付きで設定したい場所があります;)

于 2011-02-04T01:18:24.793 に答える