2012-02-29 10 views
6

Ho problemi a far sparire la tastiera nell'app per iPhone perché il UIView anche se fatto un controller non è tangibile a causa del fatto che ho un UITableView occupando il resto della schermata disponibile.Come faccio a resignFirstResponder quando faccio clic all'esterno di UITextField su UITableView

Ero curioso di sapere come avrei dovuto dare le dimissioni della tastiera alias firstResponder facendo clic sullo UITableView? C'è un modo per monitorare un evento tattile su UITableView anche se non deve selezionare una cella cliccabile.

Fondamentalmente, so come abbandonare la tastiera se la cella attiva l'evento ma, se clicco su una parte non cliccabile di UITableView, mi piacerebbe comunque che la tastiera andasse via.

risposta

6

2 opzioni:

  • Nella tua viewController, rispondono al richiamo di scorrimento della tabella e dimettersi il risponditore
-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    [self.view endEditing:YES]; 
} 
  • È sempre possibile aggiungere un UITapGestureRecognizer alla tabella/vista e dimettersi dal risponditore da t qui

Personalmente di solito lo faccio sullo scroll del tavolo, dal momento che non mi piace un singolo tocco per chiudere la tastiera.

+0

Grazie a UITapGestureRecognizer ha fatto esattamente ciò che mi serviva. Apprezzo il tempo. Sono sicuro che anche la pergamena funziona, ho solo bisogno del rubinetto in questo caso ma manterrò la pergamena nel mio inventario per dopo. – Rob

3
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    UITapGestureRecognizer *doubleTap = 
      [[UITapGestureRecognizer alloc] 
      initWithTarget:self 
      action:@selector(tapDetected:)]; 
      doubleTap.numberOfTapsRequired = 1; 
      [self.tableView addGestureRecognizer:doubleTap]; 
      [doubleTap release]; 

    } 

- (IBAction)tapDetected:(UIGestureRecognizer *)sender 
{ 
    CGPoint p = [sender locationInView:self.tableView]; 

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; 

    if(indexPath == nil) 
    { 
    NSLog(@"empty"); 
    } 
    else 
    { 
    [textField resignFirstResponder]; 
    } 
} 

penso che vi aiuterà ... provare per credere ..

+1

Ho finito per usare lo scroll perché quando metto un tapgesture sul tableview fa sì che le celle non leggano più tap e quindi le celle non invierebbero le celle perché il gesto del tap stava mangiando l'evento. Grazie comunque e probabilmente avrò bisogno di questo codice in un'altra situazione in fondo alla strada. – Rob

0
@property (weak, nonatomic) UITextField *activeTextField; // keeps track of whose keyboard is being displayed. 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.activeTextField = textField; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // if (indexPath equal to something then) 
    [self.activeTextField resignFirstResponder]; 
} 
3

l'aggiunta di un sistema di riconoscimento del rubinetto gesto è una soluzione interessante, ma c'è un'alternativa e non c'è bisogno di codificare qualsiasi cosa!

È possibile impostare in Interface Builder la proprietà keyboardDismissMode su "Dismiss on drag" per la visualizzazione tabella. È una proprietà ereditata da UIScrollView e ogni volta che si scorre la vista tabella, la tastiera viene chiusa.