2012-01-30 3 views
4

Я читал, что UILabels не предназначены для реагирования на события касания и что я могу просто использовать UIButton. Тем не менее, я должен подклассифицировать UILabel в любом случае, чтобы переопределить другой метод, поэтому я подумал, что могу использовать ярлык, чтобы изменения в моем коде были минимальными.Выполнение селектора на UILabel приводит к сбою?

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

UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(startingPoint, 5, 10, 22)]; 
    tempLabel.text = equationText; 
    tempLabel.font = [UIFont systemFontOfSize:13]; 
    [tempLabel sizeToFit]; 
    [view addSubview:tempLabel]; 
    [tempLabel addTarget:self action:@selector(updateLabel:) forControlEvents:UIControlEventTouchUpInside]; // UNRECOGNIZED SELECTOR SENT TO INSTANCE 

ответ

9

С UILabel не является органом управления, вы не можете отправить сообщение -addTarget:action:forControlEvents:. Вы должны удалить эту строку из приложения, поскольку ваш ярлык не является элементом управления и никогда не будет отвечать на это сообщение. Вместо этого, если вы хотите использовать этикетку, вы можете установить его интерактивным и добавить жест распознаватель к нему:

// label setup code omitted 
UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(updateLabel:)]; 
[tempLabel setUserInteractionEnabled:YES]; 
[tempLabel addGestureRecognizer:tap]; 
[tap release]; // if not using ARC 

обратного вызова для жеста распознаватель будет передан экземпляр жест распознаватель, который вызвал его, не управление, такое как сообщение о действии. Чтобы получить экземпляр ярлыка, вызвавшего событие, сообщите распознавателю распознанного жеста с -view. Так что, если ваш метод updateLabel: может быть реализован, как показано ниже:

- (void)updateLabel:(UIGestureRecognizer*)recognizer 
{ 
    // Only respond if we're in the ended state (similar to touchupinside) 
    if([recognizer state] == UIGestureRecognizerStateEnded) { 
    // the label that was tapped 
    UILabel* label = (UILabel*)[recognizer view]; 

    // do things with your label 
    } 
} 

Кроме того, этот жест распознаватель будет вызывать метод действия с несколькими состояниями, аналогичным тем, которые содержатся в серии методов -touchesBegan:.... Вы должны проверить, что вы выполняете только работу, в то время как распознаватель находится в соответствующем состоянии. Для вашего простого распознавателя жестов нажмите, вы, вероятно, только хотите работать, когда распознаватель находится в состоянии UIGestureRecognizerStateEnded (см. Пример выше). Для получения дополнительной информации о распознавателях жестов см. Документацию для UIGestureRecognizer.

0

Самым умным делом здесь является использование UIButton для выполнения того, что вы пытаетесь сделать.

Но если вы действительно хотите подкласс UILabel, обязательно установите userInteractionEnabled в положение YES.

The documentation says:

Новые объекты этикетки настроены игнорировать события пользователя по умолчанию. Если вы хотите обрабатывать события в пользовательском подклассе UILabel, вы должны явно изменить значение свойства userInteractionEnabled на YES после инициализации объекта.

И addTarget: action: forControlEvents: не будет работать, потому что UILabel не происходит от UIControl. В одном месте вы можете поймать свои события, выполнив метод UCResponder touchesBegan:withEvent: в вашем подклассе.

+0

изменил 'userInteractionEnabled' и добавили пустой' touchesBegan' но приложение по-прежнему падает – Mahir

+0

на другой таким образом вопрос, кто-то написал «Вы должны извлечь из UILabel и осуществлять UIResponder требует обработки сенсорной. «Я не совсем уверен, что делать, если – Mahir

+0

@MahirE Это утверждение вводит в заблуждение как * all * views наследуется от' UIResponder'. С другой стороны, не все представления наследуются от 'UIControl'. –

1

// создать ярлык

_label = [[UILabel Alloc] initWithFrame: CGRectMake (self.view.center.x-75, self.view.frame.size.высота-60, 150, 50)];

_label.backgroundColor = [UIColor clearColor]; 
_label.textColor=[UIColor whiteColor]; 
_label.text = @"Forgot password ?"; 
UITapGestureRecognizer *recongniser = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)];//ADD ACTION TO LABEL 
[_label setUserInteractionEnabled:YES]; 
[_label addGestureRecognizer:recongniser]; 

// ПЕРЕЙТИ К ONEView ДРУГОЙ ВЗГЛЯД

- (Недействительными) tapAction // МЕТОД, чтобы добавить его LABEL Селектор

{

_forgotviewController=[[ForgotPassword alloc]init]; 
[self.navigationController pushViewController:self.forgotviewController animated:YES]; 

}

0

Вот быстрая версия 2.1 для UILabel tap

let label = UILabel(frameSize) 

let gesture = UITapGestureRecognizer(target: self, action: "labelTapped:") 
labelHaveAccount.userInteractionEnabled = true 
labelHaveAccount.addGestureRecognizer(gesture) 

func labelTapped(gesture:UIGestureRecognizer!){ 
//lable tapped 
} 
Смежные вопросы