使用块的Objective C回调

时间:2013-11-09 13:24:18

标签: ios objective-c events delegates objective-c-blocks

我已经在SO上查看过各种各样的答案,但不能完全理解它是如何实际运作的。

我所拥有的是一个包含可触摸元素的GameEngine,我想要的是当触摸一个元素时它触发了GameEngine正在侦听并适当处理的“我被触摸过”的事件。

在C#中我会用委托/事件来做这件事,但似乎找不到使用块的体面obj c等价物。 - 我想使用Blocks,因为它更类似于我习惯的C#中的匿名函数。

在C#中,我只是做了类似下面的事情,在目标c中,似乎我需要编写一个代码页来使同样的事情发挥作用?

touchableObject.touched += (o) => { handler code yay }

根据Driis的回答进行编辑:

声明

typedef void (^CircleTouchedHandler)(id parameter);

@interface CircleView : UIView{
}

@property CircleTouchedHandler Touched;

如何调用它并将自己作为参数传递?

[self Touched(self)]; // this doesnt work

1 个答案:

答案 0 :(得分:1)

在Objective-C中,它看起来像:

touchableObject.touched = ^(id o) { /* handler code */ };

假设被触摸是适当的块类型的属性。如果你重新使用一个块类型(想想C#中的Func),那么输入它是有意义的,因为ObjC中的块声明往往很难快速读取。

当您使用稍微优雅的块/ lambda语法来自另一种语言时,块语法需要一些时间才能在Objective-C中习惯。要学习并作为参考,see this previous answer,这对我帮助很大。

要键入要触摸的类型,您可以使用类似:

typedef void (^Handler)(id parameter);

然后简单地将触摸的属性声明为类型处理程序。