用双重排序UITableView

时间:2018-04-08 20:10:22

标签: swift firebase firebase-realtime-database

我正在尝试创建一个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()
    })

   }

}

1 个答案:

答案 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