在ViewController和View之间传递句柄

时间:2009-07-16 22:57:00

标签: iphone uiview uiviewcontroller

我有一个基于用户输入修改的布尔数组(soundArray)。因此,它由用户正在与之交互的主UIView拥有。同时,在另一个单独的控制器(GestureController)中,我需要访问此soundArray,因此我可以将其作为方法调用中的参数传递。

我很确定ViewController不应该挖掘它不拥有的UIView的属性(正确的MVC),所以我在ViewController(MusicGridController)中创建了另一个指向soundArray的指针,该指针拥有main UIView(MusicGridView)。

在GestureController中,我有以下代码:

    // instantiate the sound thread
    NSArray *soundArrayPointers = [NSArray arrayWithObjects:self.musicGridViewController.soundArray, nil];
    [NSThread detachNewThreadSelector:@selector(metronome:) toTarget:[MusicThread class] withObject:soundArrayPointers];

(最终我在该数组中会有更多的soundArrays)。

现在,在MusicGridController中,我需要在UIView MusicGridView中设置指向SoundArray的指针...所以我这样做了:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.frame = CGRectMake(20, 0, 480, 480);
    MusicGridView *tempview = self.view;  // this line gives me a warning that I am initializing from a distinct Objective-C type, which I don't understand.

    self.soundArray = tempview.soundArray;
}

我尝试过self.soundArray = self.view.soundArray,但它犯了一个错误,我不明白为什么。所以我的问题是:这是一个正确的实现吗?如何从一个viewController获取给定UIView的属性?

1 个答案:

答案 0 :(得分:1)

我不确定我理解NSArray属于谁,或者应该属于谁,但如果它应该是一个全局对象,你可以尝试使用AppDelegate(访问超过一个视图和/或控制器。)

现在,解决您的问题。您的实施没有错,如果您在(MusicGridView *)之前添加self.view,警告就会消失。这与您尝试self.soundArray = self.view.soundArray时遇到的错误有关,原因很简单:UIView没有soundArray属性,而self.view是指向一个UIView。通过将self.view转换为MusicGridView *,您可以摆脱警告,并且您的代码应该可以正常运行。