2

我有一个视图控制器,它包含一个实例变量,其中包含一个带有一堆数据的字典对象。视图相当复杂,包含我从单独的视图文件中实例化和嵌入的几个子视图(为了避免在实际的视图控制器中有一千行 UI 代码) - 但是这些存在于它们自己的文件中的子视图如何访问我的视图控制器中的字典对象?因此,当我编辑 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];
}
4

2 回答 2

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 中调用它们。例如:

说明View.m:

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

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

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

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

于 2011-01-25T10:37:32.917 回答
1

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

@interface MyView: UIView {
    UIViewController *mViewController;
}

然后在loadView

MyView *view = [[MyView alloc] init];
view.mViewController = self;
于 2011-01-25T10:29:33.130 回答