Ho un controller di visualizzazione con UITableView. L'altezza della vista tabella è statica e == altezza dello schermo. Il numero di righe nella tabella può cambiare e a volte potrebbe essere una situazione in cui il numero di righe è inferiore al numero di righe che possono essere visibili, quindi appare un'area libera nella parte inferiore della tabella. Posso rilevare toccarlo senza il riconoscimento dei gesti? Esistono metodi delegati di UITableView?Come rilevare toccare una parte chiara di UITableView?
risposta
Sì, ci sono metodi delegato, come ad esempio:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Tuttavia, questo sarà solo dirvi se un rubinetto si verifica su una riga esistente. Se si desidera catturare i tocchi sullo spazio vuoto sotto le righe (o sull'intestazione di una sezione) sarà necessario utilizzare un riconoscitore di gesti. Si può fare qualcosa di simile:
// in viewDidLoad or somewhere similar
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)];
[self.tableView addGestureRecognizer:tap];
//.........
- (void)tableTapped:(UITapGestureRecognizer *)tap
{
CGPoint location = [tap locationInView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:location];
if(path)
{
// tap was on existing row, so pass it to the delegate method
[self tableView:self.tableView didSelectRowAtIndexPath:path];
}
else
{
// handle tap on empty space below existing rows however you want
}
}
EDIT: per un approccio alternativo, in considerazione Connor Neville's approach dalla sua risposta su questo post e aggiungere il sistema di riconoscimento gesto di sfondo della tabella.
Stai cercando di afferrare un gesto su un'area che non acquisisce automaticamente i gesti tramite il delegato, quindi AFAIK non consente di individuare facilmente un rilevatore di gesti. – Stonz2
Ora un evento non può gestire "tableTapped". Ho aggiunto UIGestureRecognizerDelegate ma non funziona. –
@VictorIppolitov potrebbe essere necessario cambiare il nome della variabile da 'self.tableView' a qualunque sia il nome della variabile di istanza/classe per la tabella. – Stonz2
Non è necessario il riconoscimento dei gesti. Si dovrebbe impliment <UITableViewDelegate>
nella vostra ViewController.h
e quindi aggiungere questo metodo per il vostro ViewController.m
:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
dove indexPath
è indice della riga/colonna cliccato.
Questo non fornirà alcuna informazione sui tocchi sul 'tableView' che si trovano nello spazio vuoto sotto le righe esistenti, che è ciò che chiede il richiedente. – Stonz2
Grazie a @ Stonz2, versione rapida:
Swift 4
let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.addGestureRecognizer(tap)
@objc func tableTapped(tap:UITapGestureRecognizer) {
let location = tap.location(in: self.tableView)
let path = self.tableView.indexPathForRow(at: location)
if let indexPathForRow = path {
self.tableView(self.tableView, didSelectRowAt: indexPathForRow)
} else {
// handle tap on empty space below existing rows however you want
}
}
Swift 3
let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.addGestureRecognizer(tap)
func tableTapped(tap:UITapGestureRecognizer) {
let location = tap.location(in: self.tableView)
let path = self.tableView.indexPathForRow(at: location)
if let indexPathForRow = path {
self.tableView(self.tableView, didSelectRowAt: indexPathForRow)
} else {
// handle tap on empty space below existing rows however you want
}
}
Swift 2:
let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.addGestureRecognizer(tap)
func tableTapped(tap:UITapGestureRecognizer) {
let location = tap.locationInView(self.tableView)
let path = self.tableView.indexPathForRowAtPoint(location)
if let indexPathForRow = path {
self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForRow)
} else {
// handle tap on empty space below existing rows however you want
}
}
Tutte le risposte fornite, inclusa la risposta accettata, aggiungerea tableView
; mentre questo funzionerà, ho scoperto che questo riconoscitore di gesti può interferire con i tocchi di riga e innescare didSelectRowAtIndexPath
in un modo alquanto imprevedibile/non deterministico.
Se si desidera rilevare i rubinetti nel "spazio vuoto", così come nelle righe, consiglio vivamente l'aggiunta di una vista di sfondo al vostro tavolo, e aggiungi il sistema di riconoscimento gesto c'è:
let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.backgroundView = UIView()
self.tableView.backgroundView?.addGestureRecognizer(tap)
** Questa è la migliore risposta **: conserva anche il risponditore della selezione 'tableView' in modo da poter vedere anche la selezione delle tue righe. –
Grazie per aver condiviso. –
- 1. UITableView toccare per deselezionare cella
- 2. Rilevamento Toccare e tenere premuto nelle celle UITableView
- 3. Come rilevare che UITableView scorre
- 4. Pseudocodice: una definizione chiara?
- 5. Come disegnare un tratto trasparente (o comunque una parte chiara di un'immagine) su iPhone
- 6. Come rilevare l'utente iPad toccare il pulsante Nascondi tastiera?
- 7. UITableView toccare e tenere premuto + drag and drop
- 8. Come rilevare l'evento di fine trascinamento di un UITableView?
- 9. Come rilevare che UITableView è in modalità di modifica?
- 10. spostamento di un UIView in cima UITableView - toccare l'UIView superiore seleziona ancora righe della tabella
- 11. Memoria cache chiara di Picasso
- 12. Come rimuovere una parte di una stringa?
- 13. Come rimuovere una parte di una stringa?
- 14. Rileva Toccare CalloutBubble in MKAnnotationView
- 15. Come posso rilevare i tocchi su una particolare parte (sottostringa) di un UILabel?
- 16. Immagine chiara con bordo sfumato
- 17. Come posso rilevare un doppio tocco su una determinata cella in UITableView?
- 18. Cercare una chiara descrizione del formato XML .xlsx di Excel
- 19. UITableView, il footer resta nella parte inferiore dello schermo?
- 20. Quanto è chiara questa domanda di intervista?
- 21. Come rilevare che una sequenza di marionette è completa
- 22. Scopes funzione Capire non chiara
- 23. Allinea le celle alla parte inferiore e superiore di UITableView, lasciando una distanza elastica nel mezzo
- 24. rilevare se UITableView è in beginUpdates/endUpdates statali
- 25. Scorrimento di UITableView
- 26. qual è la differenza tra toccare e toccare in iOS
- 27. uso non chiara dell'operatore doppio()
- 28. Come visualizzare parte di una bitmap trasparente
- 29. Utilizzare string.Substring() come parte di una catena
- 30. Come acquisire una parte di uno schermo
Per didSelectRowAtIndexPath uso selezionato oppure puoi anche usare tapgesture. –
@VictorIppolitov Cosa ne pensi di creare una sub-classe UITableView, assegnarla alla tua vista tabella, e sovrascrivere i tocchi Inizia sulla nuova sottoclasse? –