【问题标题】:Creating anonymous delegate objects in Objective-C在 Objective-C 中创建匿名委托对象
【发布时间】:2013-04-19 00:14:50
【问题描述】:

Cocoa 广泛使用委托来为异步操作提供(除其他外)回调方法。但是,我个人讨厌委托模型以及它如何通过处理非常具体的子操作来污染当前类。 UIAlertView 就是一个很好的例子。

因此,我想知道是否可以通过块简单地创建一个满足委托协议(例如UIAlertViewDelegate)要求的匿名委托对象,并将该匿名对象传递到需要委托引用的任何地方。

我想像这样:

id myDelegate = @{
    alertView:alertView didDismissWithButtonIndex:index = ^ {
        ...
    }
};

UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:... message:... delegate:myDelegate cancelButtonTitle:... otherButtonTitles:...;
[alertView show];

我听说 Objective-C 有一些很好的动态语言特性,但我不知道如何简单地向对象添加方法/选择器。这可以以相对简单的方式完成吗?

【问题讨论】:

  • 一个月前有一个关于完全通用代表的问题:stackoverflow.com/q/15438410/603977,还有一个特定于 UIAlertViewDegate 的旧问题,但我目前找不到。
  • 当然,您可以为委托创建一个完全不同的对象。例如,它不必是您的 ViewController。 (但 Objective-C 的代码块让我头晕目眩,所以我避开了它们。)
  • 希望 Apple 能够像在 Mac 端为 NSOpenPanel 所做的那样,为 UIAlertView 之类的东西添加一个基于块的 API。
  • 对不起,我想到的另一个是UIActionSheet,而不是UIAlertViewAttaching an object to a UIActionSheet

标签: objective-c cocoa-touch cocoa


【解决方案1】:

是的,您提到的语言功能通过 objective-c runtime 公开,尽管没有内置工具来动态创建委托类,并且运行时 api 不是最友好的东西。

有一个名为A2DynamicDelegate 的库,它完全符合您的要求。我没用过,但可能值得研究。

编辑:这种方法的一个问题是不保留委托,因此您需要在其他地方保留强引用,或者添加对 UIAlertView 的关联引用。您可能会发现所有这些大惊小怪是不值得的,只是向您的视图控制器添加一个额外的方法效果更好(您可以在类扩展中遵守委托协议以避免污染您的界面)。

【讨论】:

【解决方案2】:

一种选择是编写一个类,将委托协议的各个方法的块包装到委托对象中。详情见this answer

【讨论】:

  • 虽然编写一个单独的类来包装块将有助于分离关注点,但对于原本应该非常简单的事情来说,它仍然是一个非常多的开销/样板。
【解决方案3】:

您应该考虑使用为UIAlertView 添加块支持的类别,这似乎可以解决您的用例。 UIAlertView-Blocks 是我最喜欢的一个,虽然还有很多其他的。

【讨论】:

    【解决方案4】:

    如果您想通过基于委托的 API 使用块,则必须进行一些子类化。例如,请参阅 PSAlertView,它是 UIAlertView 的子类,以提供基于块的 API。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多