8

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

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

我想像这样:

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

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

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

4

4 回答 4

5

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

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

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

于 2013-04-19T01:30:37.363 回答
3

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

于 2013-04-19T02:49:34.233 回答
2

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

于 2013-04-19T14:35:39.983 回答
0

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

于 2013-04-19T00:20:44.870 回答