在Objective-C中创建匿名委托对象

时间:2013-04-19 00:14:51

标签: objective-c cocoa-touch cocoa

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

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

我想像这样:

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

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

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

4 个答案:

答案 0 :(得分:5)

是的,你提到的语言功能是通过objective-c runtime公开的,虽然没有动态创建委托类的内置工具,而运行时api并不是最友好的。

有一个名为A2DynamicDelegate的库,它正是您正在谈论的内容。我没有用它,但值得研究。

编辑:这种方法的一个问题是代理不会被保留,因此您需要在其他地方保留强引用,或者添加UIAlertView的关联引用。您可能会发现所有这些都不值得,只需在视图控制器中添加额外的方法就可以更好地工作(您可以在类扩展中符合委托协议以避免污染您的界面)。

答案 1 :(得分:3)

一种选择是编写一个类,该类将用于委托协议的各个方法的块包装到委托对象中。有关详细信息,请参阅this answer

答案 2 :(得分:2)

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

答案 3 :(得分:0)

如果要将块与基于委托的API一起使用,则必须进行一些子类化。例如,请参阅PSAlertView,哪个子类UIAlertView提供基于块的API。