2009-05-19 10 views
1

カスタムのinitWithNibNameメソッドでUILabelをプログラムで割り当て、後でviewDidLoadで文字列を割り当てようとしたとき、ラベルに何も指されませんでした。私はそれを解放しなかった。ラベルが画面に表示されます。 IBでラベルを作成し、viewDidLoadでそのラベルにテキストを割り当てると、そのラベルが機能します。IBオブジェクトとinit/viewDidLoadの手動で割り当てられたオブジェクト

手動で割り当てられたオブジェクトをviewDidLoadに設定することはできますか? 私のinitの後にviewDidLoadが呼び出されたにもかかわらず、それが何かを指していないのはなぜですか? viewDidLoadのDOCから

:ビューコントローラはメモリにその関連のビューをロードした後

このメソッドが呼び出されます。このメソッドは、ビューがnibファイルに格納されているか、loadViewメソッドでプログラムによって作成されたものかにかかわらず呼び出されます。このメソッドは、nibファイルからロードされたビューに対して追加の初期化ステップを実行するために最も一般的に使用されます。私のinitで

:のviewDidLoadで

_descriptionLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)]; 
    _descriptionLabel.numberOfLines = 0; 
    _descriptionLabel.lineBreakMode = UILineBreakModeWordWrap; 
    _descriptionLabel.font = [UIFont systemFontOfSize:12.0]; 
    _descriptionLabel.adjustsFontSizeToFitWidth = NO; 
    _descriptionLabel.text = @"Description not found."; 
    _descriptionLabel.backgroundColor = [UIColor clearColor]; 

は、変数の値は0x0です。 手動で割り当てられたUIButtonと同じです。これは、ビューが読み込まれると完全に機能します。

+0

動作しないサンプルコードを表示できますか?私はあなたが何を意味するのかわからない "ラベルは何も指していない" – stefanB

+0

説明のために編集されたオリジナルのポスト。 – hyn

+0

UILabelをIBで作成しましたか?それはIBOutlet UILableとして定義されており、IBのウインドウ上のUILabelに接続されているか、それとも実用的に作成しようとしていますか? UILable * descLabel = [[...]]? – stefanB

答えて

1

UILabelをプログラマチックに作成したい場合でも、(initWithNibNameとは対照的に)viewDidLoadで行うことができます。

viewDidLoadでUIを設定するのを恐れてはいけません。ビューが表示される前に静的UIエレメントを追加することができます。

viewDidAppear:(BOOL)animatedが呼び出される直前まで表示されません。

動的コンテンツがある場合は、viewWillAppear:(BOOL)でアニメーションを設定します。あなたは新しいラベルへの将来のアクセスを必要とする場合

[self.view addSubview:myLabel]; 

は、あなたがへのポインタを保持するためにIVARを作成する必要があります。

その後

ビューに追加してください(これはあなたの状況のように見えます)それ。

+0

私は、提案されているように私はviewDidLoadで私の初期コードを移動しました。 まだ私の初期化されたオブジェクトが0x0を指していた理由はまだ分かりません。 – hyn

+0

アップルは、追加のセットアップにはviewDidLoadを使うべきだとAppleは述べています。私はドキュメントを再読しなければなりませんが、これはおそらく理由の1つです。オブジェクトはおそらくviewDidLoadの前に正しく設定されていません。私は、Nibから初期化するときにinitWithCoderで設定を行ったことも知っていますが、具体的にコメントする状況を覚えていません。 –

0

投稿されたコードでは、_descriptionLabel UILabelは保持されず、ビューが描画される前に解放されます。

はあなたのdeallocで[_descriptionLabel解除]を入れていることを確認してください

_descriptionLabel = [[[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)] retain]; 

を試してみてください。これは、_descriptionLabelがインスタンス変数であることを前提としています。

これは、基本的に、alloc、copy、またはnewで作成したオブジェクトに適用されます。

+1

保持する必要はありません。 – hyn

関連する問題