我有一个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];
}
答案 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;