2013-09-20 3 views
9

Это в подклассе UILabel, который я сделал, но он, похоже, не работает. По какой-то причине он не вызывает «tappedOn».Жест распознаватель не работает по какой-либо причине, на iphone

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)]; 
[self addGestureRecognizer:gesture]; 
[self setUserInteractionEnabled:YES]; 

Вы знаете, почему это может быть?

Вот метод tappedOn:

-(void)tappedOn 
{ 

NSLog(@"tapped"); 
if ([self.type isEqualToString: @"load"]) 
{ 
    [self.manager.manager loadSavedGameInRow:self.name]; 
} 

if ([self.type isEqualToString: @"save"]) 
{ 
    [self.manager.manager saveGameInRow:self.name]; 
} 
} 
+4

Может быть, это часть строки без вести ** self.UserInteractionEnabled = TRUE ** к вам код. –

+0

Установите точку останова и проверьте, вызван ли ваш метод ** tappedOn ** или нет. – Manthan

+0

Вы имеете в виду userInteractionEnable? Я попытался сменить мой на TRUE, но это не сработало. –

ответ

1
gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn:)]; 
[self.view addGestureRecognizer:gesture]; 
self.UserInteractionEnabled=TRUE; 

Добавьте свой метод как этот

- (void) tappedOn:(UIGestureRecognizer*)sender 
{ 
} 

Попробуйте один

+0

Хмм, похоже, не работает –

+0

Что это за проблема? – Jitendra

+1

Это не сработает, потому что если у вас есть метод с параметром, в конце селектора должен быть «:». Действие: @selector (tappedOn :). (void) tappedOn: (UITapGestureRecognizer *) метод отправителя получил параметр: (UITapGestureRecognizer *) отправитель – incmiko

0

Не уверен, если это поможет, но получить сенсорные события исключительно использование setExclusiveTouch:

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)]; 
[self addGestureRecognizer:gesture]; 
[self setUserInteractionEnabled:YES]; 
[self setExclusiveTouch:YES]; 
+0

Это не сработает, потому что если у вас есть метод с параметром, в конце селектора должен быть «:». Действие: @selector (tappedOn :). (void) tappedOn: (UITapGestureRecognizer *) метод отправителя получил параметр: (UITapGestureRecognizer *) отправитель – incmiko

+0

@incmiko Если вы посмотрите на реализацию рассматриваемого метода, это настраиваемый метод без параметра. Но наличие «:» после селектора необходимо вообще для GestureRecognizer. В любом случае, мой фокус был сделан на setExclusiveTouch: –

0

Должно работать. Кажется, что вы добавили жест внутри кода подкласса метки. Вы уверены, что используете оба метода initWithFrame: и initWithCoder:? потому что два входа могут быть вызваны независимо на основании того, что вы создаете экземпляр метки с помощью XIB или программно.

Пример:


@implementation MyLabel 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self addGesture]; 
    } 
    return self; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if(self) { 
     [self addGesture]; 
    } 
    return self; 
} 

-(void)addGesture { 
    UITapGestureRecognizer *_g = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTap:)]; 
    [self addGestureRecognizer:_g]; 
    [self setUserInteractionEnabled:YES]; 

} 

4

Я попробовал этот код для моего проекта и его работы хорошо для меня.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureUpdated:)]; 
    tapGesture.delegate = self; 
    tapGesture.numberOfTapsRequired = 1; 
    tapGesture.numberOfTouchesRequired = 1; 
    tapGesture.cancelsTouchesInView = NO; 
    [[self view] addGestureRecognizer:tapGesture]; 

- (IBAction)tapGestureUpdated:(UIGestureRecognizer *)recognizer 
{ 
    // Code to respond to gesture here 
} 
+0

Я не использую конструктор интерфейса –

+0

Вы определили свой метод так, как я разместил? Теперь поставьте точку останова и проверьте. ваш метод определенно будет вызван. – Manthan

+0

Я попробовал, но по какой-то причине это не сработало. это так странно –

1

Я нашел хороший пример для вас: stackoverflow link

Это шаг за шагом руководство о том, как реализовать жест распознавателей в своем классе:

Соответствуют свой класс UIGestureRecognizerDelegate протокола ,

Мгновенное действие распознавателя жестов. Например, чтобы создать экземпляр UITapGestureRecognizer, мы будем делать:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)]; 

Здесь действие есть селектор, который будет обрабатывать этот жест. Здесь наш селектор handleTapFrom будет выглядеть примерно так:

- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer 
{ 
    //Code to handle the gesture 
} 

Аргумент селектора является жест распознаватель. Мы можем использовать этот жест распознаватель, чтобы получить доступ к его свойствам, например, мы можем найти состояние жеста распознавателя, как, UIGestureRecognizerStateBegan, UIGestureRecognizerStateEnded и т.д.

Установите желаемые свойства на реализованном жесте распознавателе. Например, для можно установить свойства numberOfTapsRequired и numberOfTouchesRequired.

Добавить распознаватель жестов в представление, которое вы хотите обнаружить, жесты для. В нашем примере кода (я буду делить этот код для ссылки), мы добавим жест распознавателей к ImageView с следующие строки кода:

[self.imageView addGestureRecognizer:tapGestureRecognizer]; 

После добавления жест распознаватель к мнению, установить делегат для распознавателя жестов, то есть класс, который будет обрабатывать все предметы распознавания жеста . В нашем примере кода, было бы как:

tapGestureRecognizer.delegate = self; 

Примечание: Назначение делегата после добавления жест распознаватель к зрения. В противном случае метод действия не будет вызываться.

21

Для меня это работает:

первый набор это: [self setUserInteractionEnabled:YES];

затем:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(method:)]; 
tap.numberOfTapsRequired = 1; 

[self addGestureRecognizer:tap]; 
4

В авось, что ваша метка находится вне пределов его надтаблицы, потрогать обращение скорее всего, не сработает. Стоит проверить, так как ваш код распознавателя жестов кажется правильным.

Еще одна вещь, которую нужно попробовать: вы уверены, что ваш код для добавления распознавателя жестов в представление запускается? Какой метод вы используете, когда называете это?

1

Похоже, что это должно быть в порядке ... но вы забыли свой тип перед «жестом»? Смотрите ниже, и обратите внимание на дополнительные UITapGestureRecognizer перед кодом:

UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)]; 
[self addGestureRecognizer:gesture]; 
[self setUserInteractionEnabled:YES]; 

Для более подробной информации, см this answer about how to make a label clickable.

0

У меня была такая же неприятная проблема - решение состояло в том, чтобы убедиться, что родительские представления вашего представления также имеют свойство «Включено взаимодействие с пользователем» равное true. Вы можете установить это через IB под «View» => «Interaction».

1

Попробуйте это:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 

    return true 

} 

Я использую Swift, потому что я не знаком с ObjC. Возврат true гарантирует одновременное распознавание.

Иногда вы можете захотеть установить стро некоторые ограничения, чтобы избежать конфликта, как:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    if gestureRecognizer == singleTapShowHideRecognizer { 
     return true 
    } 
    return false 
} 
+0

Большое спасибо, ваш ответ приводит меня к правильное направление –

Смежные вопросы