2009-07-17 11 views
1

編集のプロパティにアクセス:ペン先のオブジェクトは、(サブビュー)は簡潔にするためのViewController

はどのようにそのスーパービューとそのスーパーのビューコントローラでサブビューのアクセスプロパティ?簡単にチェーンを降りることができます。どうやって元に戻るの?

オリジナル(詳細)ポスト:

私が解決しようとしている当面の問題は、やや複雑なビューの「誕生」を簡略化しています。大きな画像はNibと、ビューがロードされたときに簡単なイニシャライザを超えたサブクラス(特にUIViewのもの)がどのように再構成されるかです。

私はいくつかのカスタムUIViews - 私のviewcontrollerのビューのサブビューのサブビューがあります。特にこれらのビューをインスタンス化するときには、View Controllerのいくつかのプロパティ(NSNumberFormatter、& NSDictionary)への参照が必要です。

Currenty私はそれらをインスタンス化するためのメソッドを使用します。

- (id)initWithFrame:(CGRect)frame items:(NSDictionary *)dictionary forEditingMode:(EditingMode)mode 

私は彼らが自分自身を再構成できるようにペン先にそれらを動かして実験し、基本的な設計上の問題に実行していますよ。私はinitWithFrameをデフォルトの初期化子に限定していますか?そうであれば、これらのオブジェクトはどのように親ビューコントローラを見て、辞書やその他のプロパティへの参照を取得できますか?

initWithFrame(UIApplicationデリゲートを取得するものに似たメソッド)で呼び出せるメソッドはありますか?代わりに、その子ビューがメソッドを親ビューやコントローラに送信できるようにするメソッドはありますか?

あなたは、ビューのスーパーやビュー、コントローラに接続して取得コンセントを設定し、awakeFromNibで情報を引き出すことができます...私は私が何かを壊すんだと確信している、MVC警察に

答えて

0

を送信します。それまでは接続が作成されないので、init*ではなくawakeFromNibを使用する必要があります。

FYI、Nibでインスタンス化する場合、指定された初期化子はであり、initWithFrame:ではありません(しかし、どちらにも使用しません)。

+0

このように、スーパービューまたはビューコントローラを指し示すこれらのサブビューにIBOutletを挿入するといいでしょうか?私は前にそれを見つけたことはありません...それはかなり一般的ですか? – Meltemi

+0

それは基本的にデリゲートパターンです。あなたはサブビューに 'delegate'という名前のコンセントとデリゲートプロトコルを与えます(歴史的にはこれは非公式ですが、オプションのメソッドでは正式なプロトコルを使うことができます)。次に、スーパービューをプロトコルに準拠させます。最後に、IBまたはアクセサーメッセージを使用してデリゲートとして設定します。 –

+1

うわー、ピーターが言ったように、あなたのView Controllerは本質的にサブビューの代理人になります。これを 'assign'プロパティにすることを忘れないでください。そうしないと、保持サイクルが終了します。 –

1

他の方法で動作するはずです。

ビューにはコントロール(テキストフィールドなど)のみが含まれています。データはモデルにあり、ビュー/ウィンドウコントローラはモデルと同期してビューコントロール値を調整、アクセス、設定します。

OK、コントローラとビューの間で辞書を共有する必要があることがあります。その後、ビューに辞書プロパティを作成し、ペン先の所有者のawakeFromNibメソッドで設定します。

0

おそらく、Nibがロードされた直後に、手動でView Controllerを使用して行う必要があります。つまり、共有辞書の後にビュービューを初期化する必要があります。

@interface MyViewController : UIViewController { 
    IBOutlet MyView* view1; 
    IBOutlet MyView* view2; 
    IBOutlet MyView* view3; 
} 
@end 

@implementation MyViewController 

-(void) viewDidLoad; 
{ 
    NSDictionary* sharedDict = //make the shared dictionary here; 
    view1.sharedDict = sharedDict; 
    view2.sharedDict = sharedDict; 
    view3.sharedDict = sharedDict; 
} 

@end 
関連する問題