IOS: добавить параметр в @selector - PullRequest
8 голосов
/ 22 ноября 2011

Когда у меня есть эта строка кода

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

и эта

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

Я хочу добавить в "@selector (dragGestureChanged :)" параметр, который является "(UIScrollView*) scrollView ", как мне это сделать?

Ответы [ 2 ]

9 голосов
/ 22 ноября 2011

Вы не можете напрямую - 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];
        }];
3 голосов
/ 22 ноября 2011

Таким образом, метод будет выглядеть так:

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

Селектор будет выглядеть так:

UILongPressGestureRecognizer *downwardGesture = [[UILongPressGestureRecognizer alloc]
    initWithTarget:self action:@selector(dragGestureChanged:scrollView:)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...