Visualizzazione a schermo intero della tabella solo app per iPad. Ho abilitato lo scorrimento per eliminare sulle mie righe. L'animazione della riga termina sempre dopo l'eliminazione (commitEditingStyle completa), ma occasionalmente l'intera vista tabella si blocca. Non nell'intera interfaccia utente, attenzione, quindi non è un thread principale bloccato. Sono in grado di toccare un'intestazione di colonna o toccare il pulsante Indietro sul controller di navigazione, ma il tavolo si blocca e non può essere cancellato. Posso sbloccarlo semplicemente toccando uno dei miei pulsanti di intestazione della colonna.UITableView si blocca dopo lo scorrimento per eliminare, ma non per l'intera interfaccia utente
Sono solo completamente a corto di quello che potrebbe essere la causa del congelamento. Sto usando un NSFetchedResultsController ed ecco il mio codice delegato per quello. E 'abbastanza piastra della caldaia (Aggiornamento: non come piastra della caldaia ora Utilizzando un approccio dosaggio.):
// MARK: NSFetchedResultsController delegate methods
lazy var deletedSectionIndexes : NSMutableIndexSet = {
return NSMutableIndexSet()
}()
lazy var insertedSectionIndexes : NSMutableIndexSet = {
return NSMutableIndexSet()
}()
lazy var deletedRowIndexPaths : [NSIndexPath] = {
return [NSIndexPath]()
}()
lazy var insertedRowIndexPaths : [NSIndexPath] = {
return [NSIndexPath]()
}()
lazy var updatedRowIndexPaths : [NSIndexPath] = {
return [NSIndexPath]()
}()
func controllerWillChangeContent(controller: NSFetchedResultsController) {
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch(type) {
case .Delete:
if let indexPath = indexPath {
self.deletedRowIndexPaths.appendDistinct(indexPath)
}
case .Update:
if let indexPath = indexPath {
self.updatedRowIndexPaths.appendDistinct(indexPath)
}
case .Insert:
if let newIndexPath = newIndexPath {
self.insertedRowIndexPaths.appendDistinct(newIndexPath)
}
case .Move:
if let indexPath = indexPath, newIndexPath = newIndexPath {
self.insertedRowIndexPaths.appendDistinct(newIndexPath)
self.deletedRowIndexPaths.appendDistinct(indexPath)
}
}
}
func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch(type) {
case .Delete:
self.deletedSectionIndexes.addIndex(sectionIndex)
case .Insert:
self.insertedSectionIndexes.addIndex(sectionIndex)
default:
break
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
self.tableView.beginUpdates()
self.tableView.insertSections(self.insertedSectionIndexes, withRowAnimation: .None)
self.tableView.deleteSections(self.deletedSectionIndexes, withRowAnimation: .None)
self.tableView.insertRowsAtIndexPaths(self.insertedRowIndexPaths, withRowAnimation: .None)
self.tableView.deleteRowsAtIndexPaths(self.deletedRowIndexPaths, withRowAnimation: .None)
self.tableView.reloadRowsAtIndexPaths(self.updatedRowIndexPaths, withRowAnimation: .None)
self.tableView.endUpdates()
self.insertedSectionIndexes.removeAllIndexes()
self.deletedSectionIndexes.removeAllIndexes()
self.deletedRowIndexPaths.removeAll()
self.insertedRowIndexPaths.removeAll()
self.updatedRowIndexPaths.removeAll()
}
L'eliminazione viene chiamato nel metodo delegato didChangeObject, tuttavia, tecnicamente non è una vera e propria cancellazione. Sto semplicemente impostando una proprietà su -1 e poi salvando quell'elemento attraverso NSMangagedObjectContext - a quel punto NSFRC sembra fare la cosa giusta che è rimuoverlo dalla lista di oggetti recuperati che sono stati recuperati usando questo predicato:
NSPredicate(format: "account = %@ and quantity != -1", account)
dove account
è un oggetto gestito con account valido. La riga scompare senza problemi il 90% o più del tempo. Solo in occasione del completamento dell'animazione il tavolo si congela nel maniero che ho descritto. Non si blocca mai con il pulsante Elimina ancora visualizzato, quindi so che è dopo che commitEditingStyle viene chiamato. Il pulsante Elimina non ha un'implementazione personalizzata. È l'implementazione UITableView predefinita di swipe da eliminare. Qui è il mio metodo commitEditingStyle:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
if let frameboardItem = self.fetchedResultsController.objectAtIndexPath(indexPath) as? IRMFrameBoardItemMO {
if frameboardItem.isNew {
// If it's never been pushed to the server, just delete locally. This will trigger a table reload
// via NSFetchedResultsController
DataManager.mainContext.deleteObject(frameboardItem)
} else {
// Otherwise mark it with a negative quantity which tells the server to delete it and tells the
// app to hide it.
frameboardItem.quantity = -1
}
do {
try DataManager.mainContext.save()
} catch let error as NSError {
dLog("Something went wrong: \(error.localizedDescription)")
}
}
}
}
Potete vedere un video qui di che cosa sto parlando. Sono passati più di due minuti, quindi potresti non voler vedere tutto, ma lo metto qui per riferimento.
piacerebbe sentire qualche suggerimento.
Aggiornamento
ho aggiornato i metodi delegato NSFRC utilizzare un approccio dosaggio per assicurare gli aggiornamenti vengono applicati tutti in una volta. Questo non ha risolto il problema. Il tavolo si blocca periodicamente.
Sei sicuro che l'origine dati sia stata aggiornata correttamente? C'è mai una situazione in cui 'frameboardItem' è' nil' nella seguente istruzione: 'if let frameboardItem = self.fetchedResultsController.objectAtIndexPath (indexPath) as? IRMFrameBoardItemMO'? E se è 'nil', la tabella viene aggiornata senza che l'origine dati venga aggiornata? – Alexander
Ho visto il video più volte dove stavi cancellando e si stava congelando. sembra farlo quando si eliminano alcuni in alto e in basso da una sezione, quindi si modificano le sezioni. e cancella in alto e in basso. O forse è solo una o due sezioni particolari. Mi chiedo se c'è un problema nel conteggio delle tue liste o in che modo vengono riposizionati. quello sta tenendo l'interfaccia utente della tabella. Sarebbe bello se fosse possibile ridurlo a come esattamente è riproducibile. Sto solo pensando ad alta voce. –
1) Il TableView è un controller di visualizzazione figlio? 2) Se, a scopo di test, si modifica uno dei pulsanti (che risponde ai tocchi) in modo tale da far scattare il televisore verso l'alto (o verso il basso), in realtà scorre? Ciò potrebbe fornire un indizio sul fatto che la TV stia semplicemente ignorando i tocchi o si sta congelando quando tenta di scorrere. – pbasdf