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

Posted

技术标签:

【中文标题】在 Cocoa,UIResponder 中将消息从子视图发送到父视图?【英文标题】:Sending messages from subview to superview in Cocoa, UIResponder? 【发布时间】:2011-03-24 00:51:20 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

根据子视图,目标/动作机制可能对此有好处。如果您可以从 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

警告 上面的代码完全未经测试,由于我还没有想到的原因,这可能是一个糟糕的想法。谨慎行事。预计编译错误。交叉你的手指。如果效果好,请告诉我,如果效果不好,请不要管我。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在 Cocoa,UIResponder 中将消息从子视图发送到父视图?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDFOutline 在 Swift/Cocoa 中将 TOC 添加到 PDFDocument

在 Swift、Cocoa、Mac OSX 中将 EXIF 数据设置为 NSImage

如何在 Swift(Cocoa 应用程序)中将数据传递给以前的 ViewController

通过 Cocoa 类在 Objective Pascal 单元中将 AnsiString 转换或转换为 NSMutableData

Starship,从Cocoa到肯尼迪航天中心

无法在 Swift 2 中将“__NSCFNumber”类型的值转换为“NSString”