web-dev-qa-db-ja.com

iPhone SDK:loadViewとviewDidLoadの違いは何ですか?

IPhoneアプリでビューとView Controllerを使用する場合、loadViewとviewDidLoadの違いを誰でも説明できますか?

私の個人的なコンテキストは、コードからすべてのビューを構築することです。違いがある場合は、Interface Builderを使用しません。

LoadViewにinitコードを追加すると、無限のスタックトレースになることが多いため、通常はすべての子ビューの構築をviewDidLoadで行います...初期化コードを置くのにより適切な場所は何ですか。完璧なのは、初期化呼び出しの簡単な図です。

ありがとう!

135
ryan.scott

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

多くの場合、initViewコードをloadViewに追加すると、無限のスタックトレースが発生することがわかりました。

-loadViewでself.viewを読み取らないでくださいのみsetそれをしないでくださいgetそれ。

Self.viewプロパティアクセサcalls-loadViewが現在ロードされていない場合。無限の再帰があります。

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

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

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

199
Marco

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

viewDidLoadは、ビューがロードされると呼び出されるメソッドです。これは、loadViewが呼び出された後に呼び出されます。これは、ロードされたビューの初期セットアップをさらに行うコードをオーバーライドおよび挿入できる場所です。

44
NilObject
viewDidLoad()

nIBからビューをロードし、起動後にカスタマイズを実行する場合に使用します

LoadView()

プログラムでビューを作成するときに使用します(Interface Builderを使用せずに)

13
ashokdy

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];
}
11
alamodey

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

- (void) loadView {
[super loadview];

// init code here...

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

}
2
futureelite7

loadView()は、コントローラーが_self.view_を作成するように求められたときに呼び出されます。あなたは自分のようにそれを行うことができます

_self.view = [UIView alloc] init...];
_

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

_[super loadView];
_

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

1
Dulguun Otgon

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];
}

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

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

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}
1
Josip B.

ViewDidLoadのAppleで定義された定義は、コントローラのビューがメモリにロードされた後に呼び出されることを言及しました。簡単に言えば、ロードする最初のメソッドです。

この方法が完全に活用されるのは、どのような条件下で考えているのでしょうか?答えは、基本的にアプリに最初にロードしたいものは何でもです。たとえば、白ではなく別の背景色が必要な場合は、青を選択できます。

0