我已经在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
答案 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);
然后简单地将触摸的属性声明为类型处理程序。