我有所有这些触摸敏感的子视图,我想从子视图向超级视图发送一条消息,说用户选择了它,因此超级视图可以与控制器的其余部分进行通信。
我无法在子视图和控制器之间进行通信,子视图 >> 超级视图 >> 控制器
也许使用 UIResponder 来实现这个?
我有所有这些触摸敏感的子视图,我想从子视图向超级视图发送一条消息,说用户选择了它,因此超级视图可以与控制器的其余部分进行通信。
我无法在子视图和控制器之间进行通信,子视图 >> 超级视图 >> 控制器
也许使用 UIResponder 来实现这个?
根据子视图,目标/动作机制可能对此有好处。如果您可以从 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
警告上面的代码完全未经测试,由于我还没有想到的原因,这可能是一个糟糕的想法。谨慎行事。预计编译错误。交叉你的手指。如果效果好,请告诉我,如果效果不好,请让我一个人呆着。
为什么不能用[self.superview sendMessage]
?