按多个数组对 Tableview 行进行排序
Sorting Tableview Rows By Multiple Arrays
我目前正在尝试根据每行标签上的字词对我的 table视图进行排序。每行将包含 3 个内容:颜色、动物类型和动物名称。我有一个关于如何组织 table 的特定顺序,但根据项目的加载方式,行的顺序可以是任何东西(问题)。
我想用这个数组按颜色对这些 table 进行排序:colorArray = ["red", "blue", "yellow", "green", "orange", "purple"]
。这意味着所有红色动物将排在第一位,而所有绿色动物将排在中间等。 第一个问题 是我不知道如何对数组进行排序通过另一个字符串数组。 第二个问题 是我需要其他两个数组(动物和动物名称)根据颜色数组更改它们的顺序,这样正确的动物和它们的名字就会使用正确的颜色。
示例: 如果颜色数组像 blue, green, orange, red
一样加载并且动物数组像 dog, cow, cat, monkey
一样加载,那么我将需要然后需要这两个数组被排序为red, blue, green orange
和monkey, dog, cow, cat
。这样所有的动物都具有正确的颜色。 我该如何解决这两个问题? 我已经在底部复制了我当前的代码:
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
}
切勿使用多个数组作为数据源。它们容易出错并且维护起来很烦人。使用自定义结构,这是一种面向对象的语言。
创建此结构,颜色字符串将映射到索引,反之亦然
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]
}
}
而这个数据源数组
var animals = [Animal]()
将loadAnimals()
替换为
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())
}
}
}
和cellForRow
与
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
}
现在按 colorIndex
对 animals
进行排序,您将获得所需的顺序
animals.sort{ [=14=].colorIndex < .colorIndex }
我目前正在尝试根据每行标签上的字词对我的 table视图进行排序。每行将包含 3 个内容:颜色、动物类型和动物名称。我有一个关于如何组织 table 的特定顺序,但根据项目的加载方式,行的顺序可以是任何东西(问题)。
我想用这个数组按颜色对这些 table 进行排序:colorArray = ["red", "blue", "yellow", "green", "orange", "purple"]
。这意味着所有红色动物将排在第一位,而所有绿色动物将排在中间等。 第一个问题 是我不知道如何对数组进行排序通过另一个字符串数组。 第二个问题 是我需要其他两个数组(动物和动物名称)根据颜色数组更改它们的顺序,这样正确的动物和它们的名字就会使用正确的颜色。
示例: 如果颜色数组像 blue, green, orange, red
一样加载并且动物数组像 dog, cow, cat, monkey
一样加载,那么我将需要然后需要这两个数组被排序为red, blue, green orange
和monkey, dog, cow, cat
。这样所有的动物都具有正确的颜色。 我该如何解决这两个问题? 我已经在底部复制了我当前的代码:
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
}
切勿使用多个数组作为数据源。它们容易出错并且维护起来很烦人。使用自定义结构,这是一种面向对象的语言。
创建此结构,颜色字符串将映射到索引,反之亦然
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] } }
而这个数据源数组
var animals = [Animal]()
将
loadAnimals()
替换为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()) } } }
和
cellForRow
与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 }
现在按
colorIndex
对animals
进行排序,您将获得所需的顺序animals.sort{ [=14=].colorIndex < .colorIndex }