【问题标题】:Best way to send a message to a View Controller from a deeply nested UIControl?从深度嵌套的 UIControl 向视图控制器发送消息的最佳方式?
【发布时间】:2011-06-06 03:20:32
【问题描述】:

我的应用中有以下结构:

Custom View Controller
 +- Custom View 1
   +- Custom View 2
     +- A number of UIControls

如果用户点击UIControls 之一,我想向我的自定义视图控制器发送一条消息。

目前我可以看到两种解决方案:

  1. 告诉第一个自定义视图有关控制器的信息,然后也告诉第二个自定义视图,并在我创建“UIControl”时设置目标和操作。 (我的自定义视图可能有 -initWithFrame:controller: 方法或其他东西)
  2. UIControl 可以发送我的控制器观察到的NSNotification(可能带有一些用户信息)。

我倾向于选项 2,因为我不喜欢将我的控制器告诉自定义视图 1,以便它可以告诉自定义视图 2。

我的两种解决方案的优缺点是什么,或者有其他方法吗?

更新:我现在选择NSNotification

【问题讨论】:

  • 恕我直言,除了这两种可能性之外,还有很多其他可能性,但如果不了解更多细节,就很难推荐其中一种。
  • 您需要了解哪些细节?

标签: iphone ios ios4 uiviewcontroller


【解决方案1】:

您如何从您的应用委托中保留一个指向您的 自定义视图控制器 的指针并将其作为属性公开。

然后您可以使用 UIApplication 上的静态 sharedApplication 消息来获取您的应用委托和相应的属性:

// in custom view 2 code ...
YourApplication * app = (YourApplication*)[UIApplication sharedApplication];
CustomViewController * cvc = app.customViewController;

【讨论】:

  • 是的,应该可以。也可以是我的 CustomViewController 的静态方法([CustomViewController sharedViewController]),无需通过 UIApplication 或我的应用程序委托。
  • 我假设您可以拥有多个 CustomViewController,但是是的,如果您只有一个,那很好。 :)
  • 如果我有多个,我认为您的解决方案不会起作用,是吗?
  • @thomas-muller 仅当您的应用程序委托中为您的 CustomViewController 的每个实例具有单独的属性时。例如,每个标签栏项目一个。
【解决方案2】:

有多种可能性,但最好的一种实际上取决于您的特定业务案例,以及多个嵌套 UIView 子类的用途。

  1. 为控件的tag 属性分配一个值,然后在设置它的目标动作事件时使用视图控制器中的viewWithTag: 访问它。
  2. 为每个子视图的每个 UIView 子类提供公共访问器,然后使用这些属性从视图控制器访问控件。
  3. 使用响应者链。在设置控件的 target-action 时指定一个 nil 目标,如果它实现了这个动作,它最终会被发送到视图控制器。
  4. 根据您的 UIView 子类的性质,最好通过视图的委托协议实现对视图控制器的任何必要回调。所以控件的目标动作将由包含 UIView 子类分配给它自己,并且在它的处理程序中它会调用它自己的委托方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多