2011-01-25 11 views
2

私は、データの束を持つ辞書オブジェクトを含むインスタンス変数を含むviewcontrollerを持っています。ビューは非常に複雑で、個別のビューファイルからインスタンス化して埋め込むいくつかのサブビューが含まれています(実際のビューコントロールに1000行のUIコードがないようにするため)。私の辞書オブジェクトはviewcontrollerからですか? したがって、私は、ViewView.mファイルを編集しています - どのようにViewControllerからlocationDataディクショナリオブジェクトの内容にアクセスできますか?サブビューでViewControllerからデータにアクセスするには?

私は何を意味するのかご理解ください。ビューからそのViewControllerをへの参照を持っている最も単純な方法があると

CaseViewController.h

#import "DescriptionView.h" 

@interface CaseViewController : UIViewController { 
    NSDictionary *locationData; 

    DescriptionView *descriptionView; 
} 

@property (nonatomic, retain) NSDictionary *locationData; 
@property (nonatomic, retain) DescriptionView *descriptionView; 

@end 

CaseViewController.m

- (void)loadView { 
    UIView *view = [[UIView alloc] init]; 

    descriptionView = [[DescriptionView alloc] initWithFrame:CGRectMake(0, 130, 320, 237)]; 
    descriptionView.hidden = NO; 

    [view addSubview:descriptionView]; 

    self.view = view; 
    [view release]; 
} 

答えて

5

に理想的には、ビューからのViewControllerのいずれかのプロパティにアクセスすることはありません。 MVCアーキテクチャの主なアイデアは、viewcontrollerが、何をレンダリングするのか、それとも逆ではないのかをビューコントローラが指示するということです。 だから、あなたは自分のビューは、それが初期化だ時にレンダリングするために必要なすべてのデータを提供する必要があります:あなたが動的にビューを更新する必要がある場合、あなたはあなたのビューにいくつかのメソッドを追加し、viewcolnrollerからそれらを呼び出す必要があり

- (void)loadView { 
    UIView *view = [[UIView alloc] init]; 

    descriptionView = [[DescriptionView alloc] initWithFrame:CGRectMake(0, 130, 320, 237) paramDict: self.locationData]; descriptionView.hidden = NO; 

    [view addSubview:descriptionView]; 

    [descriptionView release]; // BTW add this line here (or in dealloc) or you'll have a leak 

    self.view = view; [view release]; 
} 

を。 例:

DescriptionView.m:

-(void) updateWithDict:(NSDictionary*) udict; 

あなたはDescriptionViewでいくつかのボタンを押す(または任意の他のユーザーとの対話)されたときに、いくつかのアクションを実行する必要がある場合は良いアイデアは(DescriptionViewDelegateのようなプロトコルを宣言することになりますまたは)そのようになめらか:

-(void) descriptionViewButton1Pressed:(DescriptionView*) dview; 
-(void) descriptionViewButton2Pressed:(DescriptionView*) dview; 

は、あなたのCaseViewControllerデリゲート作成し、そのメソッドが実装されています。

+1

恐ろしい - ありがとう - あなたは論理をビューに移動しないことについて絶対に正しいです:) – Milk78

1

はここでのViewControllerからの抜粋です拡張UIView

@interface MyView: UIView { 
    UIViewController *mViewController; 
} 

その後loadView

MyView *view = [[MyView alloc] init]; 
view.mViewController = self; 
関連する問題