いいプログラムの追加SubViewsにViewDidAppear,ViewDidLoad,ViewWillAppearのコンストラクタ?
-
21-09-2019 - |
質問
私はそうとしていることからアップルの 依頼 書類の製造工程においては、原料である最高の場所への初期化を見通しコントロールをコントローラです。
とサポートでかなり簡単に、彼らは常に初期化された内部 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);
}
うな結果であUIControlsた時に追加するビューの異なるところがございます。視差がothertimesのwebviewがそれは、あなたがかけがえのない.
ある原則を守のための追加。
解決
一般的に、アドバイスをお聞かせ下さい:
ViewDidLoad -いの追加を制御するべき表示と共に、ぐっとるのは、理に適っていると思いViewDidLoad方法です。基本的にはこのメソッドが呼び出されずに読み込まれます。例えば、私は3つのラベルは、追加のラベルはこちらを見なが存在しない方。
ViewWillAppear:使っていViewWillAppear通常だけでデータの更新を行う。ですから、上記の例は、使用する実際の負荷のデータからドメインをコードしている。創UIViewsはかなり高価で、どうしたらよいかということですてやっているのViewWillAppear方法、足場がわかっていることになるとiPhoneが既に準備のUIViewの利用者に何重いま衝撃性能に非常に可視的にアニメーションなどが遅れます。
ViewDidAppear:最後に、使用しViewDidAppearスタートを切った新しいスレッドようになり、長時間実行をいうとwebservice話を別のデータします。たのは良いことであるので眺望がすでに存在するとが表示され、ユーザーで表示することができますもの"待ち"へのメッセージのユーザーがデータを取得します。
ありその他の技を使用することができますが。きたいと言う、UILabelを"fly"の形後の形態であるとみなされます。その場合、追加のラベルの形のViewDidLoadがフレーム以外の地域、そしてViewDidAppearっていて、アニメーションに飛ぶ時代に突入したと言われています。
希望です。
他のヒント
うーん、Appleのドキュメントは、私見かなり明確であるように見えます。
あなたがプログラムで独自のルートビュー(この特定のコントローラのビュー階層のルートビュー)を作成する場合は、-loadView
を呼び出すことなくsuper
でそれを作成する必要がありますし、完了したらview
プロパティを設定します。あなたのビューがペン先からロードされている場合は、あなたが-loadView
に触れてはいけません。
あなたは、View Controllerのビューにカスタムサブビューを追加するか、そうでなければ-viewDidLoad
でそれを修正します。お勧めは-viewDidLoad
であなたのUILabelとのUIWebViewを作成し、アイバーズでそれらを維持する必要がある場合-viewDidUnload
への参照を設定し、nil
でそれらを解放することです。
注:-viewDidUnload
は、もはやメモリ圧力の下で、そのビューが削除されますのでUIViewController
は、iOSの6で非推奨されていないと、ただのより呼び出されません。
のviewDidLoadは 'MEMORY' に関し、viewWillAppear / viewDidAppearは '外観' に関する。 (あなたのビューコントローラのビューのルート図である)View Controllerのビューは、コントローラのビューがすでにメモリ内にある場合でも、何回も消える/表示することができます。
(ルート・ビューを参照する場合は、ルートビューはその子への参照(サブビュー)を持っているので、私も、そのサブビューを意味するが、ビューコントローラの観点から、それは通常はルート・ビューを知っている。参考サブビューへ缶は、ビューコントローラの出口を介して正常に行われます。)
メモリの警告があるとき、ルート・ビュー自体がメモリから除去することができます。メモリからそれらを削除するための最良の時間があるときにビューコントローラが決定します。
だから、あなたは、通常のメモリに追加するサブビュー手段を追加するので、のviewDidLoadにサブビューを追加します。しかし、あなたはプログラムであなたのすべてのビューを作成していない場合は(ないのnibファイルから)。その場合は、あなたはので、この場合には、あなたはサブビューを追加するためのviewDidLoadを省略することができ、loadViewメソッドをオーバーライドして、ルート・ビューを作成し、そこにサブビューを追加する必要があります。