137

iPhone アプリでビューとビュー コントローラーを操作する場合、loadView と viewDidLoad の違いを説明できる人はいますか?

私の個人的な文脈は、私はすべてのビューをコードから構築するということです。Interface Builder は使用していませんし、使用するつもりもありません。

多くの場合、init コードを loadView に追加すると、スタック トレースが無限になることがわかったので、通常はすべての子ビューのビルドを viewDidLoad で行います...しかし、それぞれがいつ実行されるかは本当にわかりません。初期化コードを配置するのに適した場所はどこですか。完璧なのは、初期化呼び出しの簡単な図です。

ありがとう!

4

8 に答える 8

200

私はそれをやったので、ここで何が問題なのか推測できます:

初期化コードを loadView に追加すると、無限のスタック トレースが発生することがよくあります。

-loadView で self.view を読み取らないでください。設定するだけで、取得しないでください。

ビューが現在ロードされていない場合、self.view プロパティ アクセサーは -loadViewを呼び出します。あなたの無限再帰があります。

-loadView でプログラムによってビューを構築する通常の方法は、Apple の Interface-Builder 以前の例で示されているように、次のようになります。

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];

また、IB を使用していないことを責めません。私はすべての Instapaper でこの方法に固執しており、IB の複雑さ、インターフェイスの癖、および予期しない舞台裏の動作に対処するよりも、この方法の方がはるかに快適であることがわかりました.

于 2009-02-22T03:50:36.227 に答える
45

loadViewUIViewControllerビューを実際にロードしてviewプロパティに割り当てるメソッドです。UIViewControllerこれは、プロパティをプログラムで設定する場合に、のサブクラスがオーバーライドする場所でもありviewます。

viewDidLoadビューが読み込まれた後に呼び出されるメソッドです。これは、loadView が呼び出された後に呼び出されます。ビューがロードされたら、ビューの初期設定をさらに行うコードをオーバーライドして挿入できる場所です。

于 2009-02-21T23:56:28.347 に答える
11

NilObjectが何を言ったかを示すためにいくつかのコード例を追加するだけです:

- (void)loadView
{
    // create and configure the table view
    myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];   
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.scrollEnabled = NO;
    self.view = myTableView;

    self.view.autoresizesSubviews = YES;
}

- (void)viewDidLoad 
{
  self.title = @"Create group";

  // Right menu bar button is to Save
  UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
  self.navigationItem.rightBarButtonItem = saveButtonItem;
  [saveButtonItem release];
}
于 2009-02-22T00:01:16.823 に答える
2

self.view を読み取るときに無限ループが発生しないようにするには、ビューをロードするときにクラスのスーパー実装を呼び出します。スーパー実装は、新しい UIView を割り当てます。

- (void) loadView {
[super loadview];

// init code here...

[self.view addSubView:mySubview1]; //etc..

}
于 2011-03-02T06:06:55.153 に答える
1

loadViewを使用する最も簡単な方法は、UIViewControllerのサブクラスであるMyBaseViewControllerなど、ある種のベースビューコントローラーを作成することです。loadViewメソッドでは、次のようにビューを作成します。

-(void) loadView {
    if ([self viewFromNib]) {
        self.view = [self viewFromNib];
    } else {
        self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    }
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];
}

また、ビューコントローラを作成する必要がある場合は、MyBaseViewControllerのサブクラスを使用し、そのloadViewコントローラで[superloadView]を次のように呼び出します。

//sucblass loadView
-(void) loadView {
    [super loadView];

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}
于 2012-07-19T11:34:20.130 に答える
1

loadView()コントローラーがそのself.view. あなたは自分でそれを行うことができます

self.view = [UIView alloc] init...];

または、コントローラーの親 UIController クラスには-loadView()、self.view を空白のビューに初期化するメソッド名が既にあります。その後、あなたは呼び出すことができます

[super loadView];

継承を促進するため、2 番目のアプローチを強くお勧めします。ビュー コントローラーが UIViewController から直接継承されていない場合のみ。

于 2013-12-04T11:12:48.993 に答える