2017-06-26 6 views
0

---- ANTWORTEN ----Sortierung TableView Zeilen

Ich versuche gerade meine Tabellenansicht nach den Wörtern auf ihren Etiketten zu sortieren, die sie haben. Jede Zeile hat mindestens eine der 9 Farben, die ein Benutzer auswählen kann (der Benutzer kann beliebig viele auswählen). Ich habe eine bestimmte Reihenfolge, wie ich die Tabelle organisieren möchte, aber je nachdem, welche Zeile der Benutzer zuerst wählt, kann die Reihenfolge der Zeilen alles sein (das Problem).

Was ich dachte war, dass ich ein Array in der Reihenfolge mache, in der die Wörter im zweiten Bildschirm angezeigt werden sollen: "rot, blau, grün, ...." dann verbinde dieses Array irgendwie mit der Tabellenansicht. Wenn also die Tabellenansicht dieser Reihenfolge folgt (rot, blau, grün, ....) und der Benutzer blau auswählt, wird der Tisch als "rot, grün, ..." bestellt. Das bedeutet, dass unabhängig davon, welche Farben der Benutzer hat oder nicht, die Tabellenansicht der Reihenfolge des Arrays folgt. Ich habe tagelang versucht, eine Lösung für dieses Problem zu googeln und kann es nicht herausfinden. Irgendwelche Vorschläge? Ich habe meinen Code eingefügt, wie die Farben laden:

func loadColors() { 
     let colorQuery = PFQuery(className: "Colors") 
     colorQuery.whereKey("userID", equalTo: PFUser.current()?.objectId! ?? String()) //getting which user 
     colorQuery.limit = 10 
     colorQuery.findObjectsInBackground { (objects, error) in 
      if error == nil { 
       self.colorTypeArray.removeAll(keepingCapacity: false) 
       self.colorNameArray.removeAll(keepingCapacity: false)     
       self.colorObjectIDArray.removeAll(keepingCapacity: false) 

       for object in objects! { 
        self.colorTypeArray.append(object.value(forKey: "colorType") as! String) // add data to arrays 
        self.colorNameArray.append(object.value(forKey: "colorName") as! String) // add data to arrays      
        self.colorObjectIDArray.append(object.objectId!) //appends the objectid 
       } 
       self.tableView.reloadData() 

      } else { 
       print(error?.localizedDescription ?? String()) 
      } 
     } 
    } 

//places colors in rows 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ColorsCell //connects to color cell 

     cell.colorType.text = colorTypeArray[indexPath.row] //goes through array and puts colors on cell label 

     return cell 
    } 

Antwort

0

Wie ich Ihre Frage zu verstehen, muss der Benutzer eine Liste von Farben, die sie mehr Farben hinzufügen können. Ihr Ziel ist es, sicherzustellen, dass selbst wenn der Benutzer willkürliche Farben zu der Liste hinzufügt, sie eine bestimmte Reihenfolge beibehalten, die Sie vordefiniert haben.

Hier ist ein vereinfachtes Beispiel, wie ich damit umgehen würde. Grundsätzlich müssen Sie, wie Sie in Ihrer Frage gesagt haben, ein Array von Farben definieren, das als Referenz verwendet wird, um die richtige Reihenfolge zu kennen (patternColors unten).

Wenn sich die Liste der Farben ändert (z. B. wenn Sie die Liste vom Server abgerufen haben oder der Benutzer eine Farbe hinzugefügt oder entfernt hat), sortieren Sie die Liste wie unten gezeigt neu.

func sort(colors: [String]) -> [String] { 

    // This is the order I want the colors to be in. 
    var patternColors = ["Red", "Blue", "Green"] 

    // We use `map` to convert the array of three colors into 
    // an array of subarrays. Each subarray contains all the 
    // colors that match that particular pattern color (we use 
    // `filter` to find all these matching colors. 
    // Finally, we use `flatMap` to convert this array of 
    // subarrays back into a normal one-dimensional array. 
    var sortedColors = patternColors.map { patternColor in 
     colors.filter { color in 
      color == patternColor 
     } 
    }.flatMap { $0 } 

    return sortedColors 
} 


var unsortedColors = ["Blue", "Red", "Blue", "Red", "Red", "Blue", "Green", "Red"] 

let sortedColors = sort(colors: unsortedColors) 
print(sortedColors) // ["Red", "Red", "Red", "Red", "Blue", "Blue", "Blue", "Green"] 
+0

Ich habe in meinem Code direkt nach dem ich die Daten und verwenden print (sortedColors) sammeln, zeigt das Array leer aus – fphelp

+0

Ist Ihr Code auf Fehler oder mir? Hat 'patternColors' die richtigen Werte für Ihren Fall? – paulvs

+0

Ah, es tut mir so leid, es war mein Code, der das Problem hatte! Vielen Dank! – fphelp

Verwandte Themen