2012-04-12 21 views
5

Ho un campo di testo all'interno di un UIScrollView e voglio mostrare un pulsante di cancellazione quando l'utente inizia a modificare. Inoltre ho bisogno di nascondere la tastiera quando l'utente tocca lo sfondo di UIScrollview (ma non il campo di testo). La visualizzazione del pulsante di cancellazione non è un problema, il problema è che quando si tocca il pulsante Cancella la tastiera viene nascosta e il campo di testo non viene cancellato. Ovviamente il problema è con il riconoscitore di gesti, perché il metodo che si occupa di questo viene attivato quando si fa clic sul pulsante di cancellazione (ma non viene attivato quando si tocca il campo di testo). Ecco il mio codice:Il pulsante di cancellazione di UITextfield nasconde la tastiera quando è all'interno di 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; 
    } 

Qualche idea su come risolvere questo? Forse il modo migliore per aggiungere il riconoscimento dei gesti? Non riesco a pensare a nessun soluzione elegante ... Grazie mille in anticipo ...

risposta

13

Ho avuto lo stesso problema e risolto attuare il seguente metodo:

- (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; 
} 

Non dimenticare di conformarsi il protocollo "UIGestureRecognizerDelegate" e impostare il delegato (utilizzando le vars):

self.tapOutside.delegate = self; 

Acclamazioni

+0

non posso testarlo fino alla prossima settimana, ma questa sembra essere una soluzione ... grazie mille! :) –

+0

Hai provato? Ha funzionato? In tal caso, si prega di accettare questa risposta. – Thompsonian

+0

Avevo una sottoclasse UIButton personalizzata anche nella pagina, quindi ho creato isKindOfClass: [UIButton class] –

2

stavo avendo questo problema e questa soluzione ha funzionato, se yo u hanno altri pulsanti per la vista che si consente all'utente di toccare durante la compilazione del modulo è possibile effettuare le seguenti operazioni:

-(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; 
} 

Questo sarà restringere il caso solo a tornare No se il pulsante è una visualizzazione secondaria di un UITextField, come nel caso del pulsante di cancellazione, ma nasconde comunque la tastiera se tocca un pulsante normale che normalmente eseguirà il tuo codice di gesture.

Problemi correlati