2009-06-08 15 views
29

Mam UIView z wieloma polami tekstowymi. Teraz użyłem delegatów, aby zmienić respondenta z pola tekstowego na inny. W tym przypadku moja tablica na klucze zniknie, gdy użytkownik dojdzie do ostatniego pola tekstowego.Ukrywanie klawiatury, gdy użytkownik dotyka uiview

, ale teraz chcę ukryć moją tablicę, gdy użytkownik dotknie UIView (dotyka dowolnego miejsca na ekranie oprócz pól tekstowych). Czy ktoś może mi w tym pomóc?

Dzięki

Odpowiedz

43

Zastosowanie resignFirstResponder w touchesBegan, tak:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 
    if(touch.phase == UITouchPhaseBegan) { 
     [self.myTextField resignFirstResponder]; 
    } 
} 

może trzeba zadzwonić to na wielu polach tekstowych, jeśli nie jesteś pewien, gdzie koncentruje się obecnie znajduje; Nie testowałem tej sprawy.

Ponadto, w konstruktorze Interface, musisz włączyć „interakcji użytkownika Włączone” pole wyboru widoku lub programowo używać:

myView.userInteractionEnabled = YES; 
+0

ale gdzie nazwać tę resignFirstResponder . Jak poznać użytkownika dotknął UIView ??? – nbojja

+1

Edytowałem post, aby dołączyć przykład w touchesBegan. – PCheese

+0

Hej .. Dzięki za pomoc .. działa dobrze z UIView. Ale mam inny scenariusz, w którym mam pola tekstowe w UITableView. w tym przypadku twój kod nie działa.Jestem bardzo nowy w rozwoju iPhone'a, więc proszę ...... – nbojja

3

Według Beginning iPhone Development, narysować okrągły rect przycisku, tak aby obejmuje cały twój interfejs; pełny ekran. Następnie przejdź do menu Układ i kliknij Wyślij na numer. Następnie w oknie inspektora zmień typ przycisku z round rect na Custom. Teraz dodaj do tego przycisku touch wewnątrz zdarzenia i dołącz go do metody, która go obsługuje. W ciele tej metody, upewnij się, że oświadczenia:

[myTextFieldOne resignFirstResponder]; 
[myTextFieldTwo resignFirstResponder]; 

Zasadniczo wysłać wiadomość resignFirstResponder do każdego z pól tekstowych lub jakiejkolwiek dziedzinie, które mogą produkować klawiaturę.

Jestem naprawdę nowy w iPhone SDK. Nie wiem, czy to jest najlepsza metoda, ale działa i to właśnie dowiedziałem się z wyżej wymienionej książki. Mam nadzieję, że to pomoże.

+0

Czy na pewno Twoja sugestia jest zgodna z wzorcem MVC? – Malloc

2

Dzięki Blaenk, próbowałem się dowiedzieć, jak to zrobić i nie zdawałem sobie sprawy, że mogę wcisnąć przycisk w tle, dobra sztuczka! Oto mój wkład (nowy na tej stronie i Cocoa Touch, więc nie może być najbardziej wytrzymałe kod kiedykolwiek, ale to działa tak daleko ...):

nazywam tę metodę z imprezy touchUpInside na moim UIButton:

-(void)closeKeyboard:(id)sender { 
    UIView *theFirstResponder = [self findFirstResponder]; 
    if (theFirstResponder) { 
     [theFirstResponder resignFirstResponder]; 
    } 
} 

Jeżeli ta pętla znajduje się firstResponder:

- (UIView *)findFirstResponder { 
    UIView *firstResponderView = nil; 
    for (UIView *view in [self entryFields]) { 
     if ([view isFirstResponder]) { 
      firstResponderView = view; 
      break; 
     } 
    } 
    return firstResponderView; 
} 

Zależy to od każdego z kontroli w widoku o znacznik przypisaną im (ponownie UITextField można zrobić tha t w Interface Builder).

Moje dwa centy i tak, choć lepiej oddam coś!

14

użyć

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.phase==UITouchPhaseBegan){ 
     //find first response view 
     for (UIView *view in [self.view subviews]) { 
      if ([view isFirstResponder]) { 
       [view resignFirstResponder]; 
       break; 
      } 
     } 
    } 
} 
+0

Prosty, zwięzły i całkowicie ogólny. Bardzo dobrze! – ryan0

2

tak że bolesna przez to i zdobione ..

Nie potrzebujesz innego przycisku ani niczego.

Wszystko, co musisz zrobić, to wybrać "Właściciel pliku", w inspektorze przeciągnij z jego wyjścia tekstowego (lub jakkolwiek go nazwałeś) do faktycznego pola tekstowego (przez cokolwiek to nazwałeś) To będzie dodatkiem do wszelkich danych wejściowych już byłeś podłączony.

i oczywiście oprócz gniazda sterowania (UIView zmieniona na UIControl przez inspektora) do plików właściciela poprzez backgroundtouched ... pierwszą rzeczą wszyscy próbował

1

zmienić klasy UIView do klasy UIControl na karcie identyfikacji z inspektor. Dodaj:

- (IBAction)tabBackground:(id) sender; 

do pliku .h.

Dodaj do tego pliku .m:

- (IBAction)tabBackgroup:(id) sender { 
    [nameField resignFirstRespnder]; 
    [numberField resignFirstResponder]; 
} 

Połącz tabBackground od inspektora, akcja otrzymał punkt do UIView (co jest an an UIControl) i jesteś dobry, aby przejść.

25

Po prostu wywołaj to w kontrolerze widoku, gdy chcesz ukryć klawiaturę.

[self.view endEditing:NO];

+1

Dzięki człowieku! Uratowałem mój wielki dzień. :) :) –

3

super łatwy sposób to zrobić, pracuje na co PCheese powiedział.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch * touch = [touches anyObject]; 
if(touch.phase == UITouchPhaseBegan) { 
    [self.view endEditing:YES]; 
} 

}

ja wcześniej używany [self.view endEditing:YES]; do zdarzenia przycisku, ale w połączeniu z poprzednią odpowiedź to działa wspaniale. O wiele łatwiej i nie musisz robić nic innego - po prostu umieść go w swoim pliku .m. Działa to również ze wszystkimi (przynajmniej, o ile widziałem) polami tekstowymi (działa dla UITextField i UITextView).

Wiem, że OP prawdopodobnie nie będzie nadal potrzebny, ale chcę go udostępnić innym osobom z tym samym problemem.

1

Najwłaściwszym sposobem rozwiązania tego problemu jest za pomocą następującej metody:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    if(![touch.view isMemberOfClass:[UITextField class]]) { 
     [touch.view endEditing:YES]; 
    } 
} 

Uwaga: to nie działa w przypadkach UIScrollView.

0

Swift 4.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    if touch?.phase == UITouchPhase.began { 
     touch?.view?.endEditing(true) 
    } 
} 
Powiązane problemy