UITapGestureRecognizer initWithTarget: действие: метод для принятия аргументов?

Я использую UITapGestureRecognizer, потому что я использую UIScrollView, который действует как контейнер для моих UILabel s. В основном я пытаюсь использовать метод действия с аргументами, чтобы я мог, например. отправьте значение myLabel.tag методу действия, чтобы узнать, какое действие нужно предпринять в зависимости от того, что UILabel было вызвано нажатием.

Один из способов сделать это - иметь столько методов действий, как UILabel, но это не очень "симпатичный" код. То, что я хотел бы получить, - это просто один метод действия с операторами switch.

Возможно ли это, или я должен сделать это так (вздох):

UITapGestureRecognizer *myLabel1Tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myLabel1Tap)];
[myLabel1Tap addGestureRecognizer:myLabel1Tap];

UITapGestureRecognizer *myLabel2Tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myLabel2Tap)];
[myLabel1Tap addGestureRecognizer:myLabel2Tap];

UITapGestureRecognizer *myLabelNTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myLabelNTap)];
[myLabel1Tap addGestureRecognizer:myLabelNTap];

- (void)myLabel1Tap {
// Perform action
}

- (void)myLabel2Tap {
// Perform action
}

- (void)myLabelNTap {
// Perform action
}

Ответ 1

Добавьте один вид распознавателя жестов в представление, которое представляет собой просмотр ваших различных меток:

UITapGestureRecognizer *myLabelTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myLabelTapHandler:)];
[myLabelParent addGestureRecognizer:myLabelTap];

Затем, когда вы обрабатываете жест, определите, какая метка была постукирована:

-(void)myLabelTapHandler:(UIGestureRecognizer *)gestureRecognizer {
    UIView *tappedView = [gestureRecognizer.view hitTest:[gestureRecognizer locationInView:gestureRecognizer.view] withEvent:nil];

    // do something with it
}

Ответ 2

Вы можете использовать только один UITapGestureRecognizer и в вашем дескрипторе жестов (ваш myLaberXTap), который имеет синтаксис:

 - (void)handleGesture:(UITapGestureRecognizer*)gestureRecognizer {
     ...
 } 

используйте gesture.view, чтобы узнать, с каким видом вы работаете.