在Cocoa,UIResponder中将消息从子视图发送到superview?

时间:2011-03-24 00:51:21

标签: objective-c uiresponder uiview-hierarchy

我有所有这些触摸敏感的子视图,我想从子视图向superview发送消息,说用户选择了它,因此superview可以与控制器的其余部分进行通信。

我无法在子视图和控制器之间进行通信, 子视图>> superview>>控制器

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

2 个答案:

答案 0 :(得分: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

警告上面的代码完全没有经过测试,出于我尚未想到的原因,这可能是一个糟糕的想法。谨慎行事。期待编译错误。交叉你的手指。请告诉我它是否运作良好,如果没有,请不要管它。

答案 1 :(得分:0)

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