2017-11-08 2 views
0

ich benutzerdefinierte CollectionView Zelle haben und auf die Schaltfläche tippen ich closure nenne dieWarum IndexPath unterscheidet sich in Clouser

unten unter cellForItem implementiert ist, ist Code

cell.closeImageTappped = { [weak self] cell in 
     guard let strongSelf = self else { 
      return 
     } 


     if let objectFirst = strongSelf.selectedFiles.first(where: {$0.fileCategory == cell.currentSelectedCellType && $0.fileName == cell.currentObject?.fileName}) { 
      cell.imgPicture.image = nil 

      cell.imgPlusPlaceHolder.isHidden = false 
      objectFirst.removeImageFromDocumentDirectory() 
      strongSelf.selectedFiles.remove(at: strongSelf.selectedFiles.index(where: {$0.fileName == objectFirst.fileName})!) 
      strongSelf.arraySource[indexPath.section].rows.remove(at: indexPath.row) 
      strongSelf.collectionViewSelectFile.performBatchUpdates({ 
       strongSelf.collectionViewSelectFile.deleteItems(at: [indexPath]) 

      }, completion: nil) 
     } 

    } 

App-Abstürze in einigen Fällen, wie wenn ich Pressen der Nähe zu mehreren Zellen schnell

Absturz hier

strongSelf.arraySource[indexPath.section].rows.remove(at: indexPath.row) 

fatal error: Index out of range

Wenn ich überprüfen Reihen

▿ 11 Elemente - 0: 0 - 1: 1 - 2: 2 - 3: 3 - 4: 4 - 5: 5 - 6: 6 - 7: 7 - 8: 8 - 9: 8 - 10: 8

Während indexPath ist

po indexPath ▿ 2 elements - 0 : 0 - 1 : 11

Wenn ich indexPath wie diese zu erhalten zeigt es mir richtig IndexPath

self?.collectionViewSelectFile.indexPath(for: cell) ▿ Optional<IndexPath> ▿ some : 2 elements - 0 : 0 - 1 : 9

Aber warum IndexPath unterscheidet dann self?.collectionViewSelectFile.indexPath(for: cell)

+0

Unrelated aber was ist das Schwach selbst, starke Selbst zurück und her für? Wenn 'self' jemals' nil' wäre, könntest du den Knopf nicht drücken, weil es außerhalb des Bildschirms wäre. Es ist absolut sicher, '[unowned self]' zu verwenden. In Bezug auf das Problem denke ich, dass die Indexpfade nach dem Löschen einer Zelle nicht korrekt aktualisiert werden. – vadian

+0

Woher kommt 'indexPath'? Ist es von außerhalb der Schließung? – Paulw11

+0

@vadian ** Unzusammenhängend, aber was ist das schwache Selbst, starkes Selbst hin und her für? ** Yo sind richtig, ich dachte Angenommen Lange laufende Aufgabe ist in Clouser bevor es ausgeführt werden Benutzer drücken Sie die Taste zurück, so dass ich schwache selbst, ** Ich schätze, dass die Indexpfade nach dem Löschen einer Zelle nicht korrekt aktualisiert werden ** Irgendwelche Vorschläge? –

Antwort

1

indexPath kommt von außerhalb des Verschlusses, so dass ihr Wert auf erfasst die Zeit, in der die Schließung der Zelle zugewiesen ist. Nehmen wir an, Sie haben 10 Artikel in Ihrem Array und löschen den 9. Artikel. Ihr Array hat jetzt 9 Elemente, aber die Zelle, die anzeigt, was das 10. Element war (aber jetzt ist das 9. Element - Index 8 im Array) hat immer noch 9 für indexPath.row, nicht 8, also erhalten Sie eine Array-Grenze Verletzung, wenn Sie Versuchen Sie und löschen Sie die letzte Zeile.

Um dieses Problem zu vermeiden, können Sie indexPath(for:) auf Ihrer Sammlung Ansicht innerhalb des Verschlusses, um die aktuellen indexPath für die Zelle zu bestimmen, verwenden können:

cell.closeImageTappped = { [weak self] cell in 

     guard let strongSelf = self else { 
      return 
     } 


     if let objectFirst = strongSelf.selectedFiles.first(where: {$0.fileCategory == cell.currentSelectedCellType && $0.fileName == cell.currentObject?.fileName}), 
      let indexPath = collectionView.indexPath(for: cell) { 
      cell.imgPicture.image = nil 

      cell.imgPlusPlaceHolder.isHidden = false 
      objectFirst.removeImageFromDocumentDirectory() 
      strongSelf.selectedFiles.remove(at: strongSelf.selectedFiles.index(where: {$0.fileName == objectFirst.fileName})!) 
      strongSelf.arraySource[indexPath.section].rows.remove(at: indexPath.row) 
      strongSelf.collectionViewSelectFile.performBatchUpdates({ 
       strongSelf.collectionViewSelectFile.deleteItems(at: [indexPath]) 

      }, completion: nil) 
     } 

    } 
+0

Vielen Dank, ich habe bereits eine Lösung gefunden, wie in Frage erwähnt, und ich möchte nur den Grund dafür wissen, dass Sie hervorragend erklärt haben: D –

Verwandte Themen