2017-08-14 3 views
0

Ich versuche derzeit, meine Tabellenansicht nach den Wörtern auf den Etiketten in jeder Zeile zu sortieren. Jede Reihe hat 3 Dinge: eine Farbe, einen Tiertyp und den Namen des Tieres. Ich habe eine bestimmte Reihenfolge, wie ich die Tabelle organisieren möchte, aber abhängig davon, wie die Elemente geladen werden, kann die Reihenfolge der Zeilen alles sein (das Problem).Sortieren von Tabellenzeilen nach mehreren Arrays

Ich möchte diese Tabellen nach Farbe durch dieses Array sortieren: colorArray = ["red", "blue", "yellow", "green", "orange", "purple"]. Dies bedeutet, dass alle roten Tiere zuerst sein werden, während alle grünen in der Mitte usw. sind. Das erste Problem ist, dass ich nicht weiß, wie man ein Array nach einem anderen String-Array sortiert. Zweites Problem ist, dass ich die anderen zwei Arrays (Tier-und Tiernamen) brauche, um ihre Reihenfolge in Übereinstimmung mit der Farbmatrix zu ändern, damit das richtige Tier und ihre Namen mit der richtigen Farbe sein werden.

Beispiel: wenn die Farbe in Array geladen werden, wie blue, green, orange, red und das Tier wird in Array wie dog, cow, cat, monkey geladen, werde ich dann brauchen, dann müssen diese beiden Arrays in red, blue, green orangemonkey, dog, cow, cat und sortiert werden. Das ist so, dass alle Tiere die richtige Farbe haben. Wie behebe ich diese beiden Probleme? Ich habe meine aktuellen Code am unteren Rand kopiert:

func loadAnimals() { 
      let animalQuery = PFQuery(className: "Animals") 
      animalQuery.whereKey("userID", equalTo: PFUser.current()?.objectId! ?? String()) //getting which user 
      animalQuery.limit = 10 
      animalQuery.findObjectsInBackground { (objects, error) in 
       if error == nil { 
        self.colorArray.removeAll(keepingCapacity: false) 
        self.animalNameArray.removeAll(keepingCapacity: false)     
        self.animalTypeArray.removeAll(keepingCapacity: false) 

        for object in objects! { 
         self.colorArray.append(object.value(forKey: "colorType") as! String) // add data to arrays 
         self.animalNameArray.append(object.value(forKey: "animalName") as! String) // add data to arrays      
         self.animalTypeArray.append(object.value(forKey: "animalType") as! String) // add data to arrays 
        } 
        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! AnimalCell //connects to color cell 

      //Adds the animal information in the cells 
      cell.colorType.text = colorArray[indexPath.row] 
      cell.animalName.text = animalNameArray[indexPath.row] 
      cell.animalType.text = animalTypeArray[indexPath.row] 

      return cell 
     } 
+1

Verwenden ** ** eine benutzerdefinierte Struktur oder Klasse anstatt mehrere Arrays. Es macht das Leben viel einfacher und löst Ihr Problem kolllateral. Verwenden Sie für die Farben einen Index, um eine benutzerdefinierte Reihenfolge zu erhalten. – vadian

Antwort

0

niemals mehrere Arrays als Datenquelle verwenden. Sie sind fehleranfällig und lästig zu warten. Verwenden Sie eine benutzerdefinierte Struktur, das ist eine objektorientierte Sprache.

  • erstellen diese Struktur wird die Farb Zeichenfolge

    struct Animal { 
    
        static let colors = ["red", "blue", "yellow", "green", "orange", "purple"] 
    
        let name : String 
        let type : String 
        let colorIndex : Int 
    
        init(name : String, type : String, color : String) { 
         self.name = name 
         self.type = type 
         self.colorIndex = Animal.colors.index(of: color)! 
        } 
    
        var color : String { 
         return Animal.colors[colorIndex] 
        } 
    
    } 
    
  • und dieser Datenquellen-Array

    var animals = [Animal]() 
    
  • loadAnimals() mit

    Ersetzen versa

    auf einen Index und umge abgebildet werden
    func loadAnimals() { 
        let animalQuery = PFQuery(className: "Animals") 
        animalQuery.whereKey("userID", equalTo: PFUser.current()?.objectId! ?? String()) //getting which user 
        animalQuery.limit = 10 
        animalQuery.findObjectsInBackground { (objects, error) in 
         if error == nil { 
          animals.removeAll() 
    
          for object in objects! { 
           animals.append(Animal(name: object["animalName") as! String, type: object["animalType") as! String, color: object["colorType") as! String) 
          } 
          self.tableView.reloadData() 
    
         } else { 
          print(error?.localizedDescription ?? String()) 
         } 
        } 
    } 
    
  • Und cellForRow mit

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! AnimalCell //connects to color cell 
    
        //Adds the animal information in the cells 
        let animal = animals[indexPath.row] 
        cell.colorType.text = animal.color 
        cell.animalName.text = animal.name 
        cell.animalType.text = animal.type 
    
        return cell 
    } 
    
  • Jetzt sortieren animals von colorIndex und Sie erhalten den Auftrag wünschen Sie

    animals.sort{ $0.colorIndex < $1.colorIndex } 
    
+0

Ich habe dies in meinem Code und der 'Tier'-Last implementiert! Aber ich bin mir nicht sicher, wie man sie nach dem 'colorIndex' sortiert, da dies das erste Mal ist, dass ich Strukturen benutze. ** Wie implementiere ich ihre Sortierung richtig? ** – fphelp

+0

Ich habe die Antwort aktualisiert. – vadian

+0

Ok ich habe es in meinem implementiert und jetzt werden die Zeilen nach Farbe sortiert! Aber jetzt gibt es ein anderes Problem: ** Die Tiernamen werden durcheinander gebracht. Sie bleiben nicht in den richtigen Farben ** Wie behebe ich das Problem? – fphelp

Verwandte Themen