2011-01-25 43 views
2

我有一個viewcontroller,其中包含一個實例變量,包含一個字典對象與一堆數據。該視圖相當複雜,幷包含幾個子視圖,我從單獨的視圖文件實例化和嵌入(爲了避免在實際的viewcontroller中有一千行UI代碼) - 但是這些子視圖如何存在於它們自己的文件中,可以訪問我的字典對象從視圖控制器? 所以當我編輯DescriptionView.m文件 - 我如何獲得從ViewController的位置數據字典對象的內容?如何在子視圖中訪問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

理想情況下,你應該永遠不會從視圖訪問視圖 - 控制的任何屬性。 MVC架構的主要思想是viewcontroller告訴它的視圖呈現什麼,而不是反之亦然。 所以你只需要提供所有您認爲需要進行渲染期間,它的初始化數據:

- (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]; 
} 

如果您需要動態地更新你的觀點,那麼你應該添加一些方法,以您的觀點,並從viewcolnroller給他們打電話。 如:

DescriptionView.m:

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

如果您需要執行一些動作時,在DescriptionView一些按鈕被按下(或任何其它用戶交互)一個好主意,將被宣佈像DescriptionViewDelegate協議(或者像那樣):

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

然後讓你的CaseViewController成爲委託並在那裏實現那些方法。

+1

真棒 - 謝謝 - 你完全正確的是不移動邏輯到視圖:) – Milk78 2011-02-01 09:39:21

1

的simpliest辦法有它的視圖控制器參考從觀點是擴展UIView

@interface MyView: UIView { 
    UIViewController *mViewController; 
} 

然後在loadView

MyView *view = [[MyView alloc] init]; 
view.mViewController = self; 
相關問題