2016-07-06 7 views
2

Ich kämpfe um einen EXEC_BAD_ACCESS Fehler, den ich bekomme. Der Code lautet wie folgt:EXEC_BAD_ACCESS Zellinhalte in dispatch_async auffüllen

// Update the cell 
dispatch_async(dispatch_get_main_queue(), { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("customCell", forIndexPath: indexPath) as! CustomCollectionViewCell // crash here 
    cell.image.image = image 
    if(collectionView.numberOfItemsInSection(0) > indexPath.row) { 
     self.collectionView.reloadData() 
    }    
}) 

Der Code asynchron in einem Bild ausgebildet ist, in einem collectionViewCell zu füllen, nachdem eine Antwort von einem NSURLSession.dataTaskWithRequest empfing.

Der Absturz passiert auf der let cell = Zeile, weil (glaube ich) der IndexPath nicht mehr existiert (weil ich den Inhalt auf der CollectionView geändert habe). Ich bin mir nicht sicher, wie ich das überprüfen soll.

Ich dachte etwas in der Richtung von if let cell = würde funktionieren, aber ich denke, ich hätte missverstanden, wie das funktioniert. Und wenn ich andere Beiträge lese, kann ich sehen, dass Sie den Code auch nicht in einen try/catch-Block setzen können.

Irgendwelche Ideen? Vielen Dank im Voraus!

+0

Machst du das in 'cellForRow ...'? Sie sollten das tun – tbilopavlovic

+0

Ja - das ist nur ein kleiner Teil davon. Die Idee ist, dass die Zeilen angezeigt werden, und dann werden die darin enthaltenen Bilder asynchron ausgefüllt, so dass Scrollen usw. glatt ist. – Ben

+0

ok, aber warum machst du das drinnen: 'let cell = ....'? – tbilopavlovic

Antwort

2

collectionView.dequeueReusableCellWithReuseIdentifier wird verwendet, um Zellen in func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell wiederzuverwenden, anstatt sie manuell zu erstellen. Was Sie hier wollen, ist die Zelle abzurufen, nicht um sie wiederzuverwenden, also sollten Sie folgendes verwenden: cellForItemAtIndexPath(_ indexPath: NSIndexPath).

+0

Sorted - 'wenn Zelle = collectionView.ForItemAtIndexPath (indexPath) als? RewardCollectionViewCell {'- Danke für Ihre Hilfe! – Ben

Verwandte Themen