2016-05-03 20 views
0

Wenn ich suche, um dieses auf meinem Telefon auszuführen, wird der Zelle kein Häkchen zugewiesen, nachdem ich von meinem detailViewController hin und her segne. Sie haben derzeit kein Häkchen zugewiesen, daher möchte ich der Zelle ein Häkchen zuweisen, sobald sie ausgewählt wurde. Bitte lassen Sie mich wissen, wenn Sie wissen, was hier vorgeht! DankeWarum erlaubt mir dieser Code nicht, ein Häkchen-Zubehör in meine TableViewCell zu platzieren?

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
    if cell.accessoryType == UITableViewCellAccessoryType.None 
     { 
     cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
    } 

} 

Antwort

1

Zur Zeit wird eine neue Zelle aus der Warteschlange genommen, nicht unbedingt die ausgewählte Zelle. Sie sollten jedoch beibehalten, ob die Zelle mithilfe eines Modellobjekts überprüft wird oder nicht, und den Status nicht in der Ansicht selbst beibehalten. Sobald die Zelle aus der Warteschlange genommen/wiederverwendet wird, wird sie nicht mehr ausgewählt.

Zum Beispiel würden Sie eine Reihe von Modellobjekten haben:

class YourObject { 
    var isSelected: Bool = false 
} 

var modelObjects: [YourObject] = [] 

Innerhalb jedes Objekt gibt es wäre eine Eigenschaft sein, die darstellt, ob oder nicht das Objekt ausgewählt ist, kann dieses innerhalb didSelectRowAtIndexPath eingestellt werden.

var object = self.modelObjects[indexPath.row] 
object.isSelected = true 
tableView.reloadRowsAtIndexPaths([indexPath], rowAnimation: .Automatic) 

Innen cellForRowAtIndexPath können Sie überprüfen, ob die Eigenschaft auf dem Modellobjekt ausgewählt wird, wenn ja, die Zelle accessoryType zu .Checkmark gesetzt.

var object = self.modelObjects[indexPath.row] 

if object.isSelected { 
    cell.accessoryType .Checkmark 
} 
0

Das Problem ist, dass dequeueReusableCellWithIdentifier reiht eine Zelle, die derzeit nicht durch die tableView angezeigt wird, es gibt nicht die Zelle, die es in diesem Indexpfad angezeigt ist wird.

Was Sie verwenden möchten, ist cellForRowAtIndexPath, die Ihnen die Zelle für diesen Indexpfad gibt, wenn es von der tableView angezeigt wird.

Wenn Sie accessoryType für diese Zelle festlegen, wird die sichtbare Zelle aktualisiert.

0

So entfernen Sie eine neue Zelle, anstatt die ausgewählte Zelle zu aktualisieren. Um zu erreichen, was Sie wollen, ersetzen Sie diese let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) durch let cell = tableView.cellForRowAtIndexPath(indexPath).

0

Wir müssen sowohl das 'if' als auch das 'else' behandeln.

In 'cellForRowAtIndexPath':

private var selectedIndex: Int = -1  

if selectedIndex == indexPath.row 
{ 
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
} 
else 
{ 
    cell.accessoryType == UITableViewCellAccessoryType.None 
}