25

私は、Apple の大ざっぱなドキュメントから、Views コントロールを初期化してコントローラーのビューに追加するのに最適な方法を見つけようとしています。

winforms を使用すると、常に内部で初期化InitializeDesignerされ、コンストラクターで呼び出されるため、かなり簡単です。可能であれば、このパターンの信頼性を一致させようとしています。

ほとんどの場合、私は一緒にUIViewControllers、そしてUITableViewControllers内部で作業しUINavigationControllerています-これがすべてに影響する場合。

次に例を示します。

public MyController()
{
    // Here?
    AddViews();
}

public override ViewDidLoad()
{
    base.ViewDidLoad();

    // Or is should it be here?
    AddViews();
}

public override ViewWillAppear(bool )
{
    base.ViewWillAppear(animated);

    // Here?
    AddViews();
}

public override ViewDidAppear(bool animated)
{
    base.ViewDidLoad(animated);

    // Or maybe here?
    AddViews();
}

void AddViews()
{
    UILabel label = new UILabel();
    label.Text = "Test";
    label.Frame = new RectangleF(100,100,100,26);
    View.AddSubView(label);

    UIWebView webview = new UIWebView();
    webview .Frame = new RectangleF(100,100,100,26);
    View.AddSubView(webview);
}

いくつかの UIControl を別の場所でビューに追加すると、さまざまな結果が得られます。視覚的な遅延が発生することもあれば、Web ビューがどこかに隠されていることもあります。

それらを追加するための一般的な規則はありますか?

4

3 に答える 3

73

一般的に、これは私がしていることです:

  • ViewDidLoad - ビューと一緒に表示する必要があるビューにコントロールを追加するときはいつでも、すぐにそれを ViewDidLoad メソッドに入れます。基本的に、このメソッドは、ビューがメモリにロードされるたびに呼び出されます。たとえば、ビューが 3 つのラベルを持つフォームの場合、ここにラベルを追加します。これらのフォームがなければ、ビューは存在しません。

  • ViewWillAppear : 通常、ViewWillAppear はフォーム上のデータを更新するためだけに使用します。したがって、上記の例では、これを使用して実際にドメインからフォームにデータをロードします。UIView の作成にはかなりのコストがかかります。ViewWillAppear メソッドでそれを行うことはできるだけ避ける必要があります。これが呼び出されると、iPhone はすでに UIView をユーザーに表示する準備ができていることを意味し、ここで重い操作を行うことは何でもできます。非常に目に見える形でパフォーマンスに影響を与えます (アニメーションの遅延など)。

  • ViewDidAppear : 最後に、ViewDidAppear を使用して、実行に時間がかかるものへの新しいスレッドを開始します。たとえば、上記のフォームの追加データを取得するために Web サービス呼び出しを行うなどです。良いことは、ビューが既に存在するためです。ユーザーに表示されている場合、データを取得している間、ユーザーに素敵な「待機中」メッセージを表示できます。

ただし、他にも使用できるトリックがあります。フォームがロードされた後、UILabel がフォームに「飛び込む」ようにしたいとしましょう。その場合、ViewDidLoad のフォームにラベルを追加しますが、ビュー領域の外側にフレームを追加し、ViewDidAppear でアニメーションを実行してビューに戻します。

それが役に立てば幸い。

于 2010-02-17T14:46:09.070 に答える
9

うーん、Apple のドキュメントはかなり明確なようです。

独自のルート ビュー (この特定のコントローラーのビュー階層のルート ビュー) をプログラムで作成する場合は、-loadView呼び出さずに作成し、完了したらプロパティsuperを設定する必要があります。viewビューが nib からロードされている場合は、 に触れないでください-loadView

ビュー コントローラのビューにカスタム サブビューを追加するか、または で変更し-viewDidLoadます。推奨される方法は、UILabel と UIWebView を で作成して-viewDidLoadでリリースし、ivar に保持する必要がある場合は-viewDidUnloadそれらの参照を に設定することです。nil

注:-viewDidUnloadは iOS 6 で廃止され、UIViewControllerもはや呼び出されません。これは、メモリ不足でビューがパージされなくなったためです。

于 2010-02-17T12:45:19.197 に答える
2

viewDidLoad は「MEMORY」に関連し、viewWillAppear/viewDidAppear は「APPEARANCE」に関連します。ビュー コントローラーのビュー (ビュー コントローラーのビューのルート ビュー) は、コントローラーのビューが既にメモリ内にある場合でも、何度も表示/非表示になる可能性があります。

(ルート ビューを参照する場合、ルート ビューにはその子 (サブビュー) への参照があるため、そのサブビューも意味しますが、ビュー コントローラーの観点からは、通常はルート ビューのみを認識します。サブビューへの参照は通常どおり発生します。 View Controllerのアウトレットを介して。)

メモリ警告がある場合、ルートビュー自体がメモリから削除される場合があります。View Controller は、それらをメモリから削除するのに最適な時期を判断します。

したがって、サブビューを追加すると、サブビューがメモリに追加されるため、通常は viewDidLoad にサブビューを追加します。ただし、すべてのビューをプログラムで (nib ファイルからではなく) 作成する場合はそうではありません。その場合は、loadView メソッドをオーバーライドし、ルート ビューを作成してそこにサブビューを追加する必要があります。この場合、viewDidLoad を省略してサブビューを追加できます。

于 2012-01-05T12:29:57.437 に答える