2016-06-23 13 views
1

Wir versuchen, eine Sammlung anzuzeigen. In jeder Zelle können die Benutzer ein Bild auswählen und Text in ein Textfeld eingeben. Wir haben festgestellt, dass nach dem Hinzufügen von vier Zellen, wenn wir eine neue Zelle hinzufügen, das Textfeld bereits mit den Informationen aus früheren Zellen gefüllt ist. In unserem Code füllen wir nie das Textfeld programmatisch aus (das leer anfängt), erlauben wir dem Benutzer, dies zu tun. Irgendwelche Vorschläge?Swift UICollectionView Zellen mysteriöse Wiederholen

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Image", forIndexPath: indexPath) as! CollectionViewCell 
    cell.deleteButton?.addTarget(self, action: #selector(AddNewItem.xButtonPressed(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
    cell.deleteButton?.layer.setValue(indexPath.row, forKey: "index") 
    let item = items[indexPath.item] 
    let path = getDocumentsDirectory().stringByAppendingPathComponent(item.image) 
    cell.imageView.image = UIImage(contentsOfFile: path) 
    cell.imageView.layer.borderColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3).CGColor 
    cell.imageView.layer.borderWidth = 2 
    cell.layer.cornerRadius = 7 

    return cell 
} 

Antwort

2

Problem ist, dass Sie dequeReusableCellWithIdentifier verwenden, die bereits Zelle erstellt zurückgibt (die Sie zuvor bewertet wurden). Deshalb ist es bereits mit vorherigen Daten gefüllt. Sie müssen diese Daten löschen, bevor Sie diese Zelle zeigen, oder sie aus einem Speicherbereich füllen (z. B. Array, das Ihre Sammlungsansichtszellen repräsentiert (jedes Objekt in einem Array, das irgendwie mit Zelle in Verbindung steht).

+0

Wissen Sie, warum die Daten nach 4 Zellen wiederholt werden? Die vierte Zelle enthält also die gleichen Daten wie die erste Zelle, die fünfte die gleichen Daten wie die zweite Zelle und so weiter. –

+0

Ja, weil Sie Bildschirmgröße in einer Zeit 4 Zellen anzeigen können, deshalb erscheint es nach 4 Zellen. – Volodymyr

+0

Ich kann Ihnen helfen, dieses Problem morgen zu lösen oder es tief zu beschreiben, wenn Sie es brauchen. – Volodymyr

0

Hier ist, wie ich letztendlich es gelöst habe.

Ich erstellte eine Item Klasse, die alle Felder enthielt, die in der Auflistungsansichtszelle angezeigt werden, und erstellte ein Array von Elementen.

Hier ist eine vereinfachte Version meiner CollectionViewCell-Klasse, die hier nur ein einzelnes Textfeld hat:

class CollectionViewCell: UICollectionViewCell { 

    @IBOutlet weak var itemName: UITextField! 

    var item: Item? 

    func initializeListeners(){ 
     itemName.addTarget(self, action: #selector(itemNameChanged(_:)), forControlEvents: UIControlEvents.EditingChanged) 
    } 


    //When the item name is changed, make sure the item's info is updated 
    func itemNameChanged(textField: UITextField) { 
     item?.itemName = textField.text! 
    } 
} 

Hier ist eine vereinfachte Version der cellForItemAtIndexPath Funktion in meiner Ansicht Controller-Klasse:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 
    cell.initializeListeners() 
    let item = items[indexPath.item] 
    cell.item = item 
    cell.itemName.text = item.itemName 
    return cell 
} 
2

Sie können dies in UICollectionViewCell benutzerdefinierte Klasse

verwenden
+0

Für was genau ist diese Methode geeignet? :) – Abizern

+0

@Abizer PrepareForReuse von Apple Doc: Wenn die Zelle wiederverwendbar ist (hat einen Wiederverwendungsbezeichner), wird sie aufgerufen, kurz bevor die Zelle von der Tabellensichtmethode dequeueReusableCellWithIdentifier: zurückgegeben wird. Wenn Sie überschreiben, müssen Sie super aufrufen. –

+0

@GentBerani Ich weiß. Ich habe bestätigt, dass dies die Methode ist, die verwendet werden sollte. – Abizern