IOS:在@selector中添加一个参数

当我有这行代码

UILongPressGestureRecognizer *downwardGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragGestureChanged:)]; 

和这个

 - (void)dragGestureChanged:(UILongPressGestureRecognizer*)gesture{ ... } 

我想在“@selector(dragGestureChanged :)”中添加一个参数即“(UIScrollView *)scrollView”,我该怎么办?

你不能直接UIGestureRecognizer知道如何发出一个只接受一个参数的选择器的调用。 要完全一般,你可能希望能够传递一个块。 苹果公司还没有这样做,但它很容易添加,至​​少如果你愿意将手势识别器子类化,你想要解决添加新属性和正确清理的问题,而不深入研究运行时。

所以,例如(我去的时候,未经检查)

 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]; }]; 

所以方法看起来像这样:

 - (void)dragGestureChanged:(UILongPressGestureRecognizer*)gesture scrollView:(UIScrollView *)scrollview { ... } 

选择器将如下所示:

 UILongPressGestureRecognizer *downwardGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragGestureChanged:scrollView:)];