我正在尝试创建一个UITableView,它按照数据库中找到的纬度值的大小排序。虽然我的UITable Cells显示了商店的所有名称,而控制台打印了纬度,但我仍然无法弄清楚如何按照自己的纬度值对单元格进行排序。这是我目前的代码:
@IBOutlet weak var nearbyTableView: UITableView!
var myList: [String] = []
var handle:DatabaseHandle?
var ref:DatabaseReference?
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
var (cellName) = myList[indexPath.row]
cell.textLabel?.text = cellName
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
var (cellName) = myList[indexPath.row]
let viewController = self.storyboard?.instantiateViewController(withIdentifier: "Home2") as! ShopViewController
viewController.name = cellName
self.present(viewController, animated: true, completion: nil)
navigationController?.pushViewController(viewController, animated: true)
print("row\(indexPath.row)")
print("name: \(cellName)")
}
override func viewDidLoad() {
super.viewDidLoad()
let messageDB = Database.database().reference().child("shops")
messageDB.observe(.childAdded, with: { snapshot in
let snapshotValue = snapshot.value as! NSDictionary
let text = snapshotValue["name"] as! String
let lat = snapshotValue["lat"] as! Double
print(text)
print(lat)
self.myList.append(text)
self.nearbyTableView.reloadData()
})
}
}
答案 0 :(得分:0)
问题似乎是您要在数据源(myList)的末尾附加每个新元素。一种可能的选择是更改myList,使其也包含lat值(例如,使用元组(String,Double)),并在第一个具有lat大于其自身的现有元素之前插入每个新元素。例如,如果你有一个像这样的现有myList
var myList: [(String, Double)] = [("Name1", 0.1), ("Name2", 0.2), ("Name4", 0.4)]
然后您可以通过搜索适当的索引并插入该索引来添加新元素,如此
let myNewElement: (String, Double) = ("Name3", 0.3)
if let insertionIndex = myList.index(where: {myNewElement.1 <= $0.1}) {
myList.insert(myNewElement, at: insertionIndex)
}
// myList = [("Name1", 0.1), ("Name2", 0.2), ("Name3", 0.3), ("Name4", 0.4)]
之后,你的cellForRowAt:中的赋值应该改变,如下所示:
cell.textLabel?.text = myList[indexPath.row].0