2012-04-12 15 views
5

Mam pole tekstowe wewnątrz UIScrollView i chcę pokazać wyraźny przycisk, gdy użytkownik rozpoczyna edycję. Muszę też ukryć klawiaturę, gdy użytkownik kliknie tło UIScrollview (ale nie pole tekstowe). Wyświetlenie tego przycisku nie stanowi problemu, problem polega na tym, że po naciśnięciu przycisku usuwania klawiatura zostaje ukryta, a pole tekstowe nie zostanie wyczyszczone. Oczywiście problem polega na rozpoznawaniu gestów, ponieważ metoda radzenia sobie z tym jest uruchamiana po kliknięciu przycisku kasowania (ale nie jest uruchamiany, gdy pole tekstowe zostanie dotknięte). Oto mój kod:Klawisz wyczyść UITextfield ukrywa klawiaturę, gdy znajduje się wewnątrz UIScrollView

//adding gesture recognizer so i can hide keyboard when user taps scrollview 
    - (void) textFieldDidBeginEditing:(UITextField *)textField 
    { 
     if (self.tapOutside == nil) self.tapOutside = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textFieldTouchOutSide:)]; 

     [self.scrollView addGestureRecognizer:self.tapOutside]; 
    } 

    //This hides keyboard BUT IS ALSO CALLED WHEN CLEAR BUTTON IS TAPPED 
    - (void)textFieldTouchOutSide:(id)sender 
    { 
     [self.textfield resignFirstResponder]; 
    } 

    //NEVER GETS CALLED 
    - (BOOL) textFieldShouldClear:(UITextField *)textField { 
     return YES; 
    } 

Jakieś pomysły, jak rozwiązać ten problem? Może lepszy sposób na dodanie rozpoznawania gestów? Nie mogę myśleć o żadnym eleganckie rozwiązanie ... Dzięki dużo wcześniej ...

Odpowiedz

13

miałem ten sam problem i rozwiązać go wdrażaniu następującą metodę:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    // Disallow recognition of gestures in unwanted elements 
    if ([touch.view isMemberOfClass:[UIButton class]]) { // The "clear text" icon is a UIButton 
     return NO; 
    } 
    return YES; 
} 

Nie zapomnij zgodne z protokołem "UIGestureRecognizerDelegate" i ustawić delegata (przy użyciu vars):

self.tapOutside.delegate = self; 

Cheers

+0

Nie można przetestować go do przyszłego tygodnia, ale wydaje się, że jest to rozwiązanie ... wielkie dzięki! :) –

+0

Czy testowałeś to? Zadziałało? Jeśli tak, proszę przyjąć tę odpowiedź. – Thompsonian

+0

Miałem niestandardową podklasę UIButton również na stronie, więc zrobiłem to jestKindOfClass: [klasa Uibutton] –

2

właśnie posiadające ten problem i to rozwiązanie działa, jednak jeśli yo u mają inne przyciski na widoku, które pozwalają użytkownikowi na kran podczas wypełniania formularza można wykonać następujące czynności:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
// Disallow recognition of gestures in unwanted elements 
if ([touch.view isMemberOfClass:[UIButton class]] && [touch.view.superview isMemberOfClass:[UITextField class]]) { 

    // The "clear text" icon is a UIButton 
    return NO; 
} 
return YES; 
} 

Spowoduje to zawężenie sprawę tylko nie zwraca jeśli przycisk jest podrzędny od a UITextField, tak jak w przypadku przycisku clear, ale nadal ukrywa klawiaturę, jeśli dotknie normalnego przycisku, który normalnie wykona twój kod gestu.

Powiązane problemy