Вы не можете напрямую - UIGestureRecognizer
s знать, как вызвать вызов селектора, который принимает только один аргумент. Чтобы быть полностью общим, вы, вероятно, хотели бы быть в состоянии передать в блоке. Apple не встроил это, но его довольно легко добавить, по крайней мере, если вы хотите создать подкласс распознавателей жестов, вы хотите обойти проблему добавления нового свойства и очистки после него должным образом, не углубляясь в среду выполнения. .
Так, например, (написано, как я, не проверено)
typedef void (^ recogniserBlock)(UIGestureRecognizer *recogniser);
@interface UILongPressGestureRecognizerWithBlock : UILongPressGestureRecognizer
@property (nonatomic, copy) recogniserBlock block;
- (id)initWithBlock:(recogniserBlock)block;
@end
@implementation UILongPressGestureRecognizerWithBlock
@synthesize block;
- (id)initWithBlock:(recogniserBlock)aBlock
{
self = [super initWithTarget:self action:@selector(dispatchBlock:)];
if(self)
{
self.block = aBlock;
}
return self;
}
- (void)dispatchBlock:(UIGestureRecognizer *)recogniser
{
block(recogniser);
}
- (void)dealloc
{
self.block = nil;
[super dealloc];
}
@end
И тогда вы можете просто сделать:
UILongPressGestureRecognizer = [[UILongPressGestureRecognizerWithBlock alloc]
initWithBlock:^(UIGestureRecognizer *recogniser)
{
[someObject relevantSelectorWithRecogniser:recogniser
scrollView:relevantScrollView];
}];