2016-07-29 10 views
0

Ich habe mehrere Abschnitte in meinem UITableView, die jeweils eine andere Nummer UITableViewCells haben.Wie protokolliere ich Zellen, die mit NSIndexPath ausgewählt wurden?

Ich möchte die Zellen, die für jeden Abschnitt ausgewählt wurden, verfolgen und ein Bild für die Zellen anzeigen, die ausgewählt wurden.

So etwa dachte ich sie in einem Array zu speichern:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    someArray.append(indexPath) 
} 

und dann das Bild für Zellen anzeigt, die ausgewählt wurden:

for indices in self.someArray { 
    if indices == indexPath { 
     cell.button.setImage(UIImage(named: "selected"), forState: UIControlState.Normal) 
    } else { 
     cell.button.setImage(UIImage(named: "unselected"), forState: UIControlState.Normal) 
    } 
} 

Ich würde es auch machen möchte so dass nur eine Zelle pro Abschnitt ausgewählt werden kann und dass jede Auswahl für jeden Abschnitt erhalten bleibt.

Die Auswahl bleibt nicht so, wie sie sollte. Jedes Mal, wenn ich eine Auswahl in Abschnitt 0 für eine Zeile anwähle, wählt es auch den gleichen Zeilenindex für meine anderen Abschnitte aus.

Wie behebe ich das?

Antwort

3

Ich empfehle, ein Datenmodell für Ihren View-Controller zu pflegen, das alle ausgewählten Zustände für jede Zelle in Ihren verschiedenen Abschnitten enthält. (Wählen Sie einen passenderen Namen, der Ihre Zellenobjekte beschreibt).

struct Element { 
    var isSelected: Bool // selection state 
} 

Dann Ihr View-Controller würde ein Datenmodell hat, wie so:

var dataModel: [[Element]] // First array level is per section, and second array level is all the elements in a section (e.g. dataModel[0][4] is the fifth element in the first section) 

Dieses Array wahrscheinlich zu einem Bündel von Elementen initialisiert werden würde, wo isSelected falsch ist, vorausgesetzt, Sie mit allen Reihen abgewählt starten.

jetzt Ihre tableView:didSelectRowAtIndexPath Funktion würde wie folgt aussehen:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    // Check if there are any other cells selected... if so, mark them as deselected in favour of this newly-selected cell 
    dataModel[indexPath.section] = dataModel[indexPath.section].map({$0.isSelected = false}) // Go through each element and make sure that isSelected is false 

    // Now set the currently selected row for this section to be selected 
    dataModel[indexPath.section][indexPath.row].isSelected = true 
    } 

(. Eine effizientere Art und Weise könnte die zuletzt gewählte Zeile für jeden Abschnitt zu halten und dass falsch markieren, anstatt die gesamte Subarray des Abbildens)

Jetzt müssen Sie in tableView: cellForRowAtIndexPath anzeigen, ob eine Zelle basierend auf Ihrem dataModel ausgewählt wurde oder nicht. Wenn Sie den ausgewählten Status nicht in einem Datenmodell beibehalten, wird der ausgewählte Status verloren gehen, sobald eine Zelle vom Bildschirm scrollt. Außerdem wird dequeueReusableCellWithIdentifier eine Zelle wiederverwenden, die den ausgewählten Status widerspiegelt, wenn Sie Ihre Zelle nicht ordnungsgemäß aktualisieren.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("yourCellIdentifier") as! YourCellType 

    // If your data model says this cell should be selected, show the selected image 
    if dataModel[indexPath.section][indexPath.row].isSelected { 
     cell.button.setImage(UIImage(named: "selected"), forState: UIControlState.Normal) 
    } else { 
     cell.button.setImage(UIImage(named: "unselected"), forState: UIControlState.Normal) 
    } 
    } 

Hoffe das macht Sinn!

+0

Sinn macht. Also mag xcode diese Zeile nicht: dataModel [indexPath.section] = dataModel [indexPath.section] .map ({$ 0.isSelected = false}) –

+0

Außerdem bekomme ich: fataler Fehler: Index außerhalb des Bereichs für if dataModel [indexPath.section] [indexPath.row] .isSelected { –

+0

Sorry, ich habe den Code nicht selbst ausgeführt! Sie können die Karte durch eine for-Schleife ersetzen, die durch jedes Element im Unterfeld führt und sicherstellen, dass die Auswahl aufgehoben wird. Was den Index außerhalb des Bereichs betrifft, müssen Sie möglicherweise tableView: numberOfSectionsInTableView implementieren, um die korrekte Anzahl von Abschnitten zurückzugeben, ähnlich wie bei tableView: numberOfRowsInSection. Beide sollten Werte basierend auf der .count Eigenschaft Ihres dataModels zurückgeben und auf diese Weise sollten Sie keinen Index außerhalb des Bereichs bekommen ... – Undrea

Verwandte Themen