2011-12-04 4 views
2

私は、そのviewControllerを介して新しいviewcontrollerをロードするUITableViewを持っています。 このコードはのtableViewに行く:didSelectRowAtIndexPath方法:カスタムViewControllerにデータをロードする

ConcertDetailViewController *detailVC = [[ConcertDetailViewController alloc] initWithNibName:@"ConcertDetailViewController" bundle:nil]; 

のUITableViewは、モデルを持って、私は新たに作成されたのViewControllerに、このモデルの要素を送信したいです。

detailVC.aProd = [_prod objectAtIndex:indexPath.row]; 

値を設定すると、detailVCで画面にデータを描画します。私は@synthesizeによって生成されたものを上書きするカスタムセッターが動作すると思った。

-(void)setaProd:(NSMutableDictionary *)aProd { 
_aProd = aProd; 
[self displayAProd]; 
} 

displayAProdはちょうどaProd内の値を取り、画面上のにそれらを置く、というか私は自分のnibファイルで作成されたコンセントのいくつかの値を設定しています。

特別なことはありません。しかし、それは動作しません。私は理由を考え出しました。 これはsetterがより高速に実行し、ビュー全体をメモリにロードするためです。 私はself.prodNameLbl.text = @ "something"と書いています。 viewDidLoadメソッドでは、ラベルに正しい値が表示されます。 _concertsが設定されていて、そこからdisplayAProdを呼び出すと、すばやく回避できます。ここでは、ビューをロードするには良い方法だと私は自分自身を疑う。カスタムセッターがビューのロードを実行するのに時間がかかります。 _concertsが設定されているかどうかを確認するテストはfalseになり、何も表示されません。それとも、起こるのが単なる不可能なのでしょうか?

また、ビューを読み込んで表示するためのデータを渡すためのより良いパターンがあります。

ありがとうございました、Jonas。

答えて

0

NIBからView Controllerをロードすると、initWithNibNameコール中にIBOutletがUILabelや他の同様のプロパティに接続されないという問題があります。

detailVCでviewDidLoadが呼び出され、そこから[self displayAProd]を呼び出すのを待つ必要があります。この時点で、接続が確立されます。

クイックテストを行います。 didSelectRowAtIndexPathメソッドにブレークポイントを設定し、detailVCを初期化した後、prodNameLblがnullかどうかを確認します。

+0

prodNameLbl getの値は次の場合に設定されます。[self.navigationController pushViewController:detailVC animated:YES];が呼び出されます。それはdetailVC.aProdの直後です。[_prod objectAtIndex:indexPath.row]; 私は、viewDidLoadが_concertsと呼ばれていると確実に設定され、悪用される準備ができていると思います。 –

+0

確かに、ViewControllerのviewプロパティがアクセスされるまで、コントローラは準備が整っているとは限りません。これは通常、ビューが最初に表示されたときに表示されます。ナビゲーションコントローラにプッシュしたら、準備が整っているはずです。 あなたのViewControllerでリッスンする他のメッセージはawakeFromNibです(詳細はこちらhttp://developer.apple.com/library/ios/#documentation/uikit/reference/NSObject_UIKitAdditions/Introduction/Introduction.html) – reddersky

+0

awakeFromNib doesn 'トリックをしているようだ。 アップルのドキュメントから私は:iOSでは、このメッセージは、ペン先のコードでインスタンス化されたインターフェイスオブジェクトにのみ送信されます。 File's Owner、First Responder、または他のプレースホルダーオブジェクトには送信されません。 これは、nibローディングコードでインスタンス化されたインターフェイスオブジェクトにのみ送信されます。私はそれが何を意味するのか分からないのですか? –

関連する問題