2012-01-10 18 views
18

Chcę odpowiedzieć na zdarzenia dotyku (w szczególności UIControlEventTouchUpInside i UIControlEventTouchUpOutside) na UITextField, ale jedynym wydarzeniem, które przychodzi, jest UIControlEventTouchCancel.Jak mogę odpowiedzieć na zdarzenia dotykowe na UITextField?

Nie mogę użyć UIControlEventEditingDidBegin, ponieważ występuje tylko wtedy, gdy pole się skupia, co nie jest tym, co próbuję wykryć. Chcę wiedzieć, kiedy użytkownik podnosi palec i czy jest w środku pola tekstowego lub poza nim, niezależnie od aktualnego stanu skupienia.

Czy ktoś wie w jaki sposób to osiągnąć?

Aby było jasne, próbowałem używać addTarget:action:forControlEvents, a to nie działa. Zdarzenie "dotknięcie" jest blokowane przez anulowanie. Chcę, aby metoda wykrywania dotyku była w stanie ją pochłonąć i wygenerować zdarzenie Anuluj.

Ponadto, jeśli to możliwe, chciałbym uniknąć tworzenia dodatkowych widoków.

Odpowiedz

-1

Dodaj cel dla wybranego wydarzenia programowo lub użyj IB.

UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)]; 

[touchyTextField addTarget:self 
        action:@selector(yourDesiredMethod) 
      forControlEvents:UIControlEventTouchUpInside]; 
+7

Nie, to zdecydowanie nie działa. Pierwsza rzecz, którą próbowałem. Metoda "yourDesiredMethod" nigdy nie jest wywoływana. Mogę otrzymywać zdarzenia dla UIControlEventTouchDown, ale żadne z zdarzeń TouchUp nie jest uruchamiane. Zamiast tego jest wywoływane zdarzenie UIControlEventTouchCancel. Nie mogę po prostu użyć tego zdarzenia jako hacky proxy dla zdarzenia, które chcę, ponieważ jest ono również uruchamiane, gdy długie naciśnięcie powoduje wyświetlenie pętli powiększenia, a gdy coś innego anuluje dane wprowadzane przez użytkownika, takie jak modalne okno dialogowe lub ekran blokady . – theK42

+0

Wow, założyłem, że będzie działało jak każda inna klasa oparta na UIView. Możesz być w stanie stworzyć niestandardowy UITextField i zastąpić metodę touchesBegan:, upewniając się, że stanie się on pierwszą odpowiedzią w odpowiednich przypadkach, więc klawiatura nadal będzie się wyświetlać. –

+0

Próbowałem więc nadpisać dotknięcia/Zakończono/Anulowano, a także dało mi parę Początek/Anulowano, bez zdarzenia Zakończonego. To naprawdę frustrujące! Nadpisywanie tych metod nie przeszkadza w tym, że textField staje się pierwszym respondentem, więc klasa bazowa robi obsługę dotyku, zanim otrzymam szansę! – theK42

4

Dobrze okrągłe o sposób prowadzenia byłoby stworzyć UIButton z wypełnieniem ustawiony, aby wyczyścić na pokrycie wszystkich przestrzeni, a UITextField na wierzchu. Jeśli użytkownik dotknie pola tekstowego, pole tekstowe powinno wysłać zdarzenie, a jeśli użytkownik dotknie poza polem tekstowym, UIButton wyśle ​​zdarzenie.

+0

Ponieważ nie mogę spowodować, że zdarzenie dotknie wnętrza pola tekstowego, nie będzie to działać. Chciałbym również unikać tworzenia dodatkowych widoków, jeśli to możliwe. – theK42

2

Dobra odpowiedź tutaj: Change default touch events for UITextField

Użyj delegata polu tekstowym i robić to, co chcesz robić w textFieldShouldBeginEditing:

Możesz powrócić NO aby zapobiec zachowanie domyślne.

+0

To nie jest bezużyteczna informacja, może pomóc mi zbliżyć się do zachowania, które chcę. Nie jest to jednak kompletna odpowiedź, ponieważ nie może mi pomóc wykryć dotknięć, które zaczynają się wewnątrz i kończą poza polem tak, jak powinien wyglądać "UIControlEventTouchUpOutside". – theK42

+0

Oczywiście. Powinienem właściwie przeczytać twoje pytanie! – beev

+0

Słowo ostrzeżenia tutaj. Ta metoda uruchamia się w większej liczbie przypadków niż po prostu dotykając, na przykład po naciśnięciu klawisza na zewnętrznej klawiaturze, aby przechodzić przez pola tekstowe. Testowany na iOS 9. –

0

Ten problem wystąpiłam właśnie dzisiaj. Moim celem była zmiana koloru tła pola tekstowego po dotknięciu i przywrócenie go po dotknięciu/anulowaniu. To jest dziwne, że dotyk jest wysyłany do celu z UITextField, ale w środku jest dotykowy, dotykowy na zewnątrz, a nawet dotykowy nie są. Znalazłem rozwiązanie. To jest proste. Po prostu utwórz podklasę UITextField i przesuń dotknięcia. Wyłóż: i dotknieCancelled :.

@interface TextField : UITextField 

@end 

@implementation CuteTextField 

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

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesEnded:touches withEvent:event]; 
    self.backgroundColor=GetDefaultBackgroundColor(); 
} 

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesCancelled:touches withEvent:event]; 
    self.backgroundColor=GetDefaultBackgroundColor(); 
} 

@end 
1

Możesz utworzyć kategorię dla UiView i zastąpić touchBegan meathod w następujący sposób.

To działa dobrze dla mnie.I to jest scentralizowane rozwiązanie dla tego problemu.

#import "UIView+Keyboard.h" 
@implementation UIView(Keyboard) 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.window endEditing:true]; 
    [super touchesBegan:touches withEvent:event]; 
} 


@end 
Powiązane problemy