7

Xcode 4.2を使用すると、私のアプリケーションでは、ビューのロードがセグエイベントによってトリガーされます。ビューコントローラ内で最初に呼び出されるメソッドは何ですか?

-(void) viewWillAppear:(BOOL)animated動作しますが、それは最初ですか?

初期化は、オブジェクトの作成時にメソッドが手動で呼び出されることはないStoryboardように思われることから発生します。init

クラスのインスタンスを手動で作成する場合、通常[[alloc]init]は最初に作成します。[init]この場合、は最初に実行されるメソッドであり、さまざまな初期化に適した場所です。

initセグエイベントを介してクラスのインスタンス化が発生する場合のメソッドに相当するものは何ですか?このような場合、どのメソッドにすべての初期化ロジックを含める必要がありますか?

4

3 に答える 3

14

最良の選択肢はだと思います-(void)awakeFromNib。これは1回だけ発生しますが、viewWillAppearandviewDidLoadなどは初期化後に複数回呼び出される可能性があります。

更新:以下のJean-Denis Muysが指摘しているように、複数回呼び出される可能性があるため、-(id)initWithCoder:(NSCoder *)decoder一度だけ呼び出されるイニシャライザーにはより良いオプションです。-(void)awakeFromNib

于 2011-12-09T04:33:12.747 に答える
8

AppleのViewControllerプログラミングガイドによると、

ストーリーボードでViewControllerを作成すると、InterfaceBuilderで構成した属性がアーカイブにシリアル化されます。後で、View Controllerがインスタンス化されると、このアーカイブがメモリにロードされて処理されます。結果は、属性がInterfaceBuilderで設定したものと一致するオブジェクトのセットです。アーカイブは、ViewControllerのinitWithCoder:メソッドを呼び出すことによってロードされます。次に、その awakeFromNibメソッドを実装する任意のオブジェクトでメソッドが呼び出されます。このメソッドを使用して、他のオブジェクトがすでにインスタンス化されている必要がある構成手順を実行します。

于 2012-03-27T19:05:04.820 に答える
3

awakeFromNibを使用しないことをお勧めします。私はこれらの機能の両方を単純に使用します

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self setup];
    }
    return self;
}

- (void)setupButton {
    /* get ready to be called twice */
    self.layer.cornerRadious = 10.0f;
}

理由: UIButtonをサブクラス化したとしましょう。2つのシナリオの準備ができている必要があります。

シナリオ1.プログラムでボタンを追加した場合->initWithFrame->setupUIが呼び出されますシナリオ2.NIbを使用してボタンを追加した場合->initWithCoder->setupUIが呼び出されます。

于 2016-04-08T13:15:36.460 に答える