2011-03-24 64 views
0

我有所有这些触摸敏感的子视图,我想从子视图发送消息到超级视图,说用户选择它,所以超级视图可以与控制器的其余部分进行通信。在Cocoa,UIResponder中发送子视图到superview的消息?

我不能在子视图和控制器之间的通信, 子视图>>上海华>>控制器

也许使用,UIResponder实现这一目标?

回答

0

根据子视图的不同,目标/动作机制对此很有帮助。如果你可以从UIControl派生你的子视图,那么让子视图发送他们的动作信息到他们的目标(通常是你的视图控制器)是特别容易的。您将能够在Interface Builder中布置视图,并通过将它们连接到视图控制器来指定它们的目标和操作。如果由于某种原因无法从UIControl派生它们,那么您必须实施等同于目标/操作,并且您不会在IB中获得相同的支持,但它仍然非常简单。

另一种可能性是让视图控制器为所有子视图执行触摸处理。这基本上是按照您的建议利用响应者链,但在触摸处理层面。如果有很多子视图需要追踪,这可能并不理想,但它是可行的。

做到这一点的第三种方法是让子视图在选定时发布通知。

因为UIResponder没有提供沿响应者链传递任意消息的机制。我不确定添加该功能是从子视图向视图控制器专门发送消息的最优雅方式。视图控制器和子视图之间有潜在的许多中间对象,并且当你已经知道你想要消息的去向似乎是错误的时候涉及整个链。不过,考虑扩展UIResponder以使响应者链不仅仅是事件的管道是有意义的。你可以一个类别添加到UIResponder:

@interface UIResponder (Messages) 
- (void)sendMessage:(SEL)message withObject:(id)object; 
@end; 

@implementation UIResponder (Messages) 
- (void)sendMessage:(SEL)message withObject:(id)object 
{ 
    if ([self respondsToSelector:message]) { 
     [self performSelector:message withObject:object]; 
    } 
    else { 
     [[self nextResponder] sendMessage:message withObject:object]; 
    } 
} 
@end 

警告上面的代码是完全未经测试,并且可能是我还没有想到的原因,一个糟糕的主意。谨慎行事。预计编译错误。横过你的手指。请让我知道它是否运作良好,如果没有,请让我一个人待着。

0

为什么不能使用[self.superview sendMessage]