2012-01-21 33 views
51

Ho un UITableView come sottoview del mio UIScrollVIew, che è la vista principale controllata dal mio MainViewController.didSelectRowAtIndexPath: non viene chiamato

In MainViewController.h

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource> 

// other stuff here... 

@property (weak, nonatomic) IBOutlet UITableView *myTableView; 

In MainViewController.m

@synthesize myTableView; 

// other stuff here... 

- (void)viewDidLoad { 
    myTableView.delegate = self; 
    myTableView.datasource = self; 
} 

// other stuff here... 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
    [self performSegueWithIdentifier:@"listAttributesSegue" sender:self]; 
} 

So che didSelectRowAtIndexPath non viene chiamato perché ho impostare punti di interruzione sia sul metodo stesso e la linea di codice all'interno e nessuno dei due viene chiamato. So anche che l'origine dati funziona correttamente perché ho altre funzioni che modificano le celle in fase di esecuzione e funzionano perfettamente bene. Sto usando l'ultimo Xcode con iOS 5.0 impostato come target di sviluppo. Ho cercato e cercato una risposta. Qualcuno ha qualche idea?

Modifica: Ho trovato la risposta. Avevo un UITapGestureRecognizer impostato per la superView di myTableView. Questo ha annullato la chiamata di selezione. Ringraziamo chi ha suggerito che potrebbe essere questo. La tua risposta è stata cancellata prima che potessi contrassegnarla correttamente.

Edit 2: Un sacco di persone sono state commentando su questo, così ho pensato che avrei condiviso esso. Se si verifica questo problema, è sufficiente impostare myGestureRecognizer.cancelsTouchInView su false e tutto dovrebbe funzionare correttamente.

+0

Avete implementato 'tableView: willSelectRowAtIndexPath:'? Forse sta ritornando nil impedendo così 'didSelectRowAtIndexPath:' dalla chiamata? –

+0

sì, l'ho provato anch'io – Garrett

+0

Grazie per essere tornato con la soluzione. Penso che potrebbe essere meglio inserire la modifica come risposta. –

risposta

263

Ho trovato la risposta. Avevo un UITapGestureRecognizer impostato per la superView di myTableView. Questo ha annullato la chiamata di selezione. Ringraziamo chi ha suggerito che potrebbe essere questo. La tua risposta è stata cancellata prima che potessi contrassegnarla correttamente.

Impostare la proprietà cancelsTouchesInView-NO sul riconoscitore gesto per consentire la visualizzazione della tabella per intercettare l'evento.

+13

Questo era il problema per me, il mio collega ha aggiunto un UITapGestureRecognizer a una vista a livello di primo livello che stava mangiando i miei eventi tap. La cosa fuorviante era, tuttavia, che le celle della tabella si sarebbero ancora evidenziate quando venivano intercettate, quindi non sospettavo che qualcosa stesse intercettando quegli eventi. – bugloaf

+14

Questo è il problema anche per me. Assicurati di controllare la proprietà cancelsTouchesInView del riconoscimento dei gesti.Se è SÌ, allora mangia l'evento. –

+0

Grazie mille, mi ha davvero salvato la giornata. Non sapevo che un UITapGestureRecognizer aggiunto dallo storyboard avrebbe impedito il richiamo della funzione! Curiosamente le UITableViewCells dove sono ancora evidenti i Tap. – David

5

Hai definito la variabile di istanza per tableview con lo stesso nome. Se poi non potrebbe essere questo può essere il problema-

_myTableView.delegate = self; 
_myTableView.datasource = self; 

Or-

self.myTableView.delegate = self; 
self.myTableView.datasource = self; 
+0

ho provato self.myTableView.delegate senza successo – Garrett

+1

Impressionante! Cerca in lungo e in largo per questo problema, e il problema era che non avevo impostato: self.tableView.delegate = self; – hbruce

10

Il tuo problema è maiuscole e minuscole. Il tuo codice:

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 

dovrebbe essere

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
+1

che è stata una buona presa, ma l'errore è stato semplicemente un errore di battitura durante la copia del mio codice nella domanda, è giusto nella mia app – Garrett

+0

Che differenza tra due linee di codice? –

+1

La "i" nella prima "tabellaView" è in maiuscolo nella prima versione (errata). –

7

forse è un errore di battitura, dopo tutto. Verifica che la tua funzione non sia didDeselectRowAtIndexPath: (de seleziona invece di selezionare).

+0

Ho letto il mio codice 20 venti volte confrontandolo con il testo di un libro e ancora non mi sono accorto che avevo 'De'select! –

+0

Quando affidarsi al completamento del codice è sbagliato, ci ho dedicato solo un'ora, grazie per avermi salvato molti di più. –

1

Siamo spiacenti, non abbiamo ottenuto abbastanza punti per aggiungere commenti - la risposta di Garret è grande, ma vorrei aggiungere:

si può ancora avere il vostro sistema di riconoscimento gesto ma è necessario impostare 'Annulla tocchi in vista' NO - allora i gesti saranno consegnati alla vista e il tuo UITableView funzionerà correttamente.

Dopo aver provato molti approcci, questo sembra essere il modo corretto di fare le cose: un touch gesture riconoscitore con 'cancella tocco in vista' è come avere uno strato invisibile sopra tutto ciò che cattura tutti gli eventi e li indirizza al controller della vista (il proxy). Il controller della vista quindi guarda il gesto per vedere se ha un'azione vincolante (pulsanti, ecc.) E instraderà quelli e tutti gli altri andranno semplicemente al gestore del gesto. Quando si utilizza un UITableView si prevede di ricevere il tap ma il controller della vista lo inquadra quando si ha "Cancella i tocchi in vista".

0

ho avuto questo problema per un po ', e non ho visto alcun riferimento a qui, quindi per riferimento, un altro motivo per questo potrebbe essere che:

tableView.editing = YES; 

ma

tableView.allowsSelectionDuringEditing = NO; 

Come da documentazione per

- tableView:didSelectRowAtIndexPath: 

Questo metodo non è chiamato quando la proprietà di modifica della tabella è impostata su SÌ (ovvero, la vista tabella è in modalità di modifica). Per ulteriori informazioni (ed esempi di codice) relativi a questo metodo, consultare "Gestione delle selezioni" in Guida alla programmazione in Tabella Visualizza per iOS.

5

La mia soluzione è:

  1. set cancelsTouchesInView Per No di qualsiasi tapGesture

  2. ho trovato nella mia cella personalizzato, userInteractionEnable è impostato su NO, è sufficiente eliminare userInteractionEnable = No e problema è risolto.

0

Una cella può essere selezionato dall'utente (toccando la riga), chiamando "tableView.selectRowAtIndexPath (..)" o "cell.setSelected (vero, ...).

  • Se la cella è selezionata chiamando "cell.setSelected (vero)", l'utente non può deselezionare la cella più.

  • Se la cella è selezionata chiamando "tableView.selectRowAtIndexPath()", il l'utente può deselezionare la cella come previsto.

3

Annulla le altre visualizzazioni tocca tranne quella richiesta.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch { 
    if (touch.view == your view) { 
     return YES; 
    } 
    return NO; 
} 
7

aggiornato per Swift 3:

se siete abituati UITapGestureRecognizer nel codice: - # Swift 3 utilizzo sotto le righe di codice:

extension YourViewController{ 
    func hideKeyboardWhenTappedAround() { 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard)) 
     view.addGestureRecognizer(tap) 
     tap.cancelsTouchesInView = false 
    } 

    func dismissKeyboard() { 
     view.endEditing(true) 
    } 
} 

Come chiamare: - In viewDidLoad()

self.hideKeyboardWhenTappedAround() 
1

Il mio caso è strano. My TableView ha 2 sezioni. Le celle della prima sezione funzionano bene su tableView:didSelectRowAt:, ma le celle della seconda sezione non si attivano didSelectRowAt:.

Il problema precedente si verifica a iPhone 4s, iOS 9.3. Ma nel iPhone 5s, iOS 10.3, non ci sono problemi, quelle celle funzionano bene. Sembra come iOS 9 bug su UITableView.

Dopo molti test, ho scoperto che un codice di linea produce questo errore.

tableView.estimatedSectionHeaderHeight = 60.0 

Perché la 2a sezione non ha una vista di intestazione. Rimuovere questa linea e tutto funziona correttamente.

0

Ho avuto un errore intermittente di didSelectRowAtIndexPath: essere chiamato sulla mia cella personalizzata.

ho scoperto che se ho smesso di chiamare [tableView reloadData] molto spesso (10 Hz), e ha cambiato per aggiornare ogni 2 secondi, quasi ogni pressione chiamerebbe successo didSelectRowAtIndexPath:

Sembra che il caricamento dei blocchi vista presse.

Problemi correlati