【问题标题】:How to access data from ViewController in subview?如何在子视图中从 ViewController 访问数据?
【发布时间】:2011-01-25 10:11:08
【问题描述】:

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

希望你明白我的意思。

这是来自 ViewController 的 sn-p:

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

【问题讨论】:

    标签: iphone ios sdk subview viewcontroller


    【解决方案1】:

    理想情况下,您永远不应该从视图访问 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 中调用它们。 例如:

    DescriptionView.m:

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

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

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

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

    【讨论】:

    • 太棒了 - 谢谢 - 你没有将逻辑移到视图中是绝对正确的 :)
    【解决方案2】:

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

    @interface MyView: UIView {
        UIViewController *mViewController;
    }
    

    然后在loadView

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 2013-05-25
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多