如何在两个View Controller实例之间共享值?

时间:2010-11-22 03:14:30

标签: iphone cocoa cocoa-touch delegates

我有一个View Controller,它将UIView初始化为视图。该视图将另一个UIView初始化为子视图。两个UIView都通过委托/协议与View Controller进行通信。

每个UIView都创建一个ViewController的实例,并使其等于委托:

ViewController *aDelegate = [[ViewController alloc] init];
self.delegate = aDelegate;

问题:视图控制器有一个名为(int)的变量,由两个UIViews修改。两个视图都必须知道彼此如何修改变量,但由于每个视图都有一个不同的View Controller实例,因此无法进行通信。我该如何解决这个问题?

非常感谢

编辑:Peter提到在我喜欢的视图创建中分配委托,但是我如何为子视图执行此操作,因为它是在UIView而不是View Controller中创建的。 PS。实际上它是子视图的子视图的子视图,所以我可以在View Controller中创建它们然后将其指定为委托吗?

尝试按如下方式分配委托,但是当我尝试从视图中调用ViewController方法时它会不断崩溃:

MyView *mainView = [[MyView alloc] initWithFrame:frame];
self.view = mainView;
mainView.delegate = self;
[mainView release];

2 个答案:

答案 0 :(得分:0)

听起来,不是每个视图分配视图控制器的单独实例,而是要将创建视图的视图控制器实例指定为每个视图的委托。

解决此问题的一种方法是让视图控制器在创建视图时将自身指定为视图的委托。

答案 1 :(得分:0)

视图不需要彼此了解。在视图控制器中,您可以为子视图定义属性

@property (nonatomic, retain) MyView *myView;

然后创建子视图并分配代理。这可以在viewDidLoad

中完成
- (void)viewDidLoad {
    [super viewDidLoad];

    CGRect frame = ...;
    MyView *subView = [[MyView alloc] initWithFrame:frame];
    self.myView = subView;
    subView.delegate = self;
    [self.view addSubView:subView];
    [subView release];


    self.view.delegate = self;
} 

然后在你的委托方法中,我只是猜到了它的外观,你可以更新视图控制器以及其他视图。

- (void)view:(MyView *)view didUpdateSelection:(int)newSelection {
    self.selection = newSelection;
    if (view == self.view) {
        self.myView.selection = newSelection;
    }
    else {
        self.view.selection = newSelection;
    }
}