如何从子视图中的ViewController访问数据?

时间:2011-01-25 10:11:09

标签: iphone ios sdk subview viewcontroller

我有一个viewcontroller,它包含一个包含带有一堆数据的字典对象的实例变量。视图相当复杂,包含几个子视图,我从单独的视图文件中实例化和嵌入(为了避免在实际的viewcontroller中有一千行UI代码) - 但是这些子视图如何存在于自己的文件中,可以访问来自viewcontroller的我的字典对象? 因此,当我编辑DescriptionView.m文件时 - 如何从ViewController访问locationData字典对象的内容?

希望你理解我的意思。

以下是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];
}

2 个答案:

答案 0 :(得分:5)

理想情况下,您永远不应该从视图中访问viewcontroller的任何属性。 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中调用它们。 E.g:

DescriptionView.m:

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

如果你需要在按下DescriptionView中的某个按钮(或任何其他用户交互)时执行某些操作,那么一个好主意就是声明一个像DescriptionViewDelegate这样的协议(或类似的那样):

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

然后让你的CaseViewController成为委托并在那里实现那些方法。

答案 1 :(得分:1)

从视图中引用其viewcontroller的最简单方法是扩展UIView

@interface MyView: UIView {
    UIViewController *mViewController;
}

然后在loadView

MyView *view = [[MyView alloc] init];
view.mViewController = self;