【问题标题】:UIView communication with UIViewControllerUIView 与 UIViewController 的通信
【发布时间】:2011-09-23 03:26:23
【问题描述】:

在 UIViewController 中,我以编程方式创建了大约 10 个 CustomUIView 实例并将它们放置在 [UIViewController 视图] 上。

当任何这些 CustomUIView 实例被触摸时,我想让控制器知道并采取一些行动。

我想到了两种方法:

  1. 将 UIViewController 订阅为 CustomUIView 的观察者。然后当 touchesBegan:withEvent: 被触发时,调用 UIViewController 观察者的方法。

  2. 使用 [self.nextResponder touchesBegan:touches withEvent:event] 将事件引发到 UIViewController。

我都实现了,它们都工作正常。

问题:以编程方式创建的视图与其 UIViewController 通信的最佳方式是什么?其中之一是要走的路吗?还是有第三种方式?

我在网上找到的资源非常适合解释所有 Cocoa“部分”,但我很难找到整体架构的最佳实践。

【问题讨论】:

    标签: iphone cocoa-touch uiview uiviewcontroller


    【解决方案1】:

    对于触摸事件,您无需执行任何操作!

    来自UIViewController class reference

    视图控制器与它们管理的视图紧密绑定,并参与用于处理事件的响应者链。视图控制器本身是 UIResponder 类的后代,并被插入到托管根视图与其父视图之间的响应者链中,通常属于不同的视图控制器。如果视图控制器的视图不处理事件,则视图控制器本身可以选择在将事件传递给父视图之前处理事件。

    这意味着您的视图控制器无需任何额外设置即可在其视图中处理触摸事件,只要您不在视图中处理它们。

    【讨论】:

    • 好的。所以我只是在 UIViewController 中实现 touchesBegan:withEvent:。那挺好的。唯一的问题是我不确定如何获得对被触摸视图的引用。想法?
    • [event allTouches] 将为您提供事件中的触摸,对于每次触摸,您都可以通过 touch.view 找出触摸发生在哪个视图中。请参阅UITouch class reference
    【解决方案2】:

    如果您希望视图能够与控制器通信,您可以将 UIViewController 设为 UIView 的 delegate

    触摸事件将作为responder chain 的一部分自动发送到控制器。

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多