2010-07-03 11 views
96

Ok, więc mam UILabel utworzony w konstruktorze interfejsów, który wyświetla pewien domyślny tekst "dotknij, aby rozpocząć".Obsługa zdarzenia dotykowego w UILabel i podłączenie go do IBAction

Gdy użytkownik dotknie UILabel chcę wywołać metodę IBAction: -(IBAction)next; który aktualizuje tekst na etykiecie do powiedzenia coś nowego.
Byłoby naprawdę wygodnie, gdyby to pozwoliło mi po prostu przeciągnąć połączenie z mojej metody do mojej etykiety, a następnie wybrać dotykowy wewnątrz, tak jak w przypadku przycisku. ale niestety, nie ma cygara.

Tak czy inaczej, myślę, że moje pytanie brzmi, czy będę musiał podklasę UILabel, aby to działało? Czy jest jakiś sposób, że mogę przeciągnąć przycisk nad etykietą, ale sprawię, że będzie 0% nieprzejrzysty. A może brakuje prostszego rozwiązania?

Odpowiedz

252

Sprawdź:

UILabel *label = ... 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *tapGesture = 
     [[UITapGestureRecognizer alloc] initWithTarget:self 
               action:@selector(labelTap)]; 
[label addGestureRecognizer:tapGesture]; 

Sztuką jest umożliwienie interakcji z użytkownikiem.

+1

Co zrobić, jeśli mam wiele etykiet? jak mogę rozróżnić, który został dotknięty? – learner

+1

@learner wypróbuj właściwość znacznika. upewnij się, że używasz labelTap: zamiast labelTap. i użyj - (void) labelTap: (id) sender ;. – thedjaney

+1

@thedjaney Nadawca jest UITapGestureRecognizer, a nie UILabel – h4labs

70

UILabel dziedziczy z UIView, który dziedziczy po UIResponder. Wszystkie obiekty UIresponder mogą obsługiwać zdarzenia dotykowe. Więc w pliku klasy, który wie o widoku (który zawiera UILabel) realizują:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event; 

interfejs konstruktora ustawiona wartość tagu UILabel użytkownika. kiedy występują akcenty w swojej metodzie touchesBegan, sprawdzić wartość tag widoku, do którego znacznik należy:

UITouch *touch = [touches anyObject]; 

if(touch.view.tag == MY_TAG_VAL) 
label.text = @"new text"; 

podłączyć swój kod w pliku klasy z obiektem UILabel w interfejsie konstruktora deklarując zmienną instancji UILabel z prefiks IBOutlet:

IBOutlet UILabel *label; 

Następnie w konstruktorze interfejsów można je połączyć.

+0

Szybko i prosto, Dzięki bardzo, uratowałeś mi trochę poważnego czasu. – wbarksdale

+31

Jedna uwaga, musisz upewnić się, że zaznaczyłeś "User Interaction Enabled" w konstruktorze interfejsów, bo to nie zadziała. – midas06

+0

Uderzyłem jeden problem tą metodą. Wszystko działało dobrze, gdy kontroler podglądu został załadowany bezpośrednio, ale kiedy stworzyłem kontroler nawigacyjny, pchnąłem kontroler zawierający etykietę do kontrolera nawigacyjnego, a następnie wyświetlając go, dotknięcia nie wydają się już docierać do etykiety. Jakieś pomysły? – midas06

30

Można użyć UIButton, uczynić go przezroczystym, tj. Niestandardowy typ bez obrazu i dodać na nim UILabel (wyśrodkowany). Następnie podłącz zwykłe zdarzenia przycisku.

+0

Zgadzam się, niestandardowy typ przycisku powinien dać użytkownikowi doświadczenie typu UILabel. – stitz

+2

+1, ładne i proste. Próbowałem już wcześniej, ustawiając normalny przycisk na opactiy 0, który nie działał, ale wskazówka, aby zmienić typ na niestandardowy działała idealnie. –

+0

Nieprzezroczystość wpłynie na przycisk i wszystkie jego subviews, więc nieprzezroczystość = 0 sprawi, że całość będzie niewidoczna. – Eiko

6

Swift 3

masz IBOutlet

@IBOutlet var label: UILabel! 

w którym umożliwiają interakcję użytkownika i dodać rozpoznawania gestów

label.isUserInteractionEnabled = true 
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:))) 
label.addGestureRecognizer(tapGesture) 

I wreszcie, uchwyt kranu

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) { 
    // Your code goes here 
} 
Powiązane problemy