在ViewController和View之间传递句柄

问题描述:

我有一个基于用户输入修改的布尔值数组(soundArray)。因此,它由用户正在与之交互的主UIView拥有。同时,在另一个单独的控制器(GestureController)中,我需要访问这个soundArray,所以我可以在方法调用中将它作为参数传递。我很确定一个ViewController不应该挖出它不属于它的UIView(正确的MVC)的属性,所以我创建了另一个指向ViewController(MusicGridController)中的soundArray的指针,它拥有主要的UIView(MusicGridView)。在ViewController和View之间传递句柄

在GestureController,我有以下代码:

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

(最终我将有一个数组中更soundArrays)。

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

- (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的属性?

我不知道我理解的NSArray属于谁,或者是谁应该属于,但你可以尝试利用AppDelegate的,如果它应该是一个全局对象(由多个视图访问和/或控制器)。

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