swift - 使用 double 对 UITableView 进行排序

标签 swift firebase firebase-realtime-database

我正在尝试创建一个 UITableView,它按数据库中找到的纬度值的大小排序。尽管我的 UITable 单元格显示了所有商店的名称并且控制台打印了纬度,但我仍然不知道如何按单元格自己的纬度值对单元格进行排序。这是我当前的代码:

@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()
    })

   }

}

最佳答案

问题似乎是您在数据源 (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

关于swift - 使用 double 对 UITableView 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49722280/

相关文章:

javascript - Firebase V9 addDoc 未返回成功或失败或写入数据库

firebase - 如何从Firebase(真实数据库)中检索标记到Flutter中的新Google Maps API

android - 重复的 jar 条目 - android

ios - 在登录成功时执行 segue

ios - 在 Swift 中为 NSMutableAttributedString 设置 kCTUnderlineStyleAttributeName

firebase函数:secrets:set is not a Firebase command

swift - firebase 错误考虑添加 ".indexOn":

ios - Swift UI 是否像 UIKit 一样具有类似于 viewDidLoad() 的功能?如果没有,如何创建这样一个在启动时调用的函数?

swift - 如何在 map View 中更改 swift 4.0 中的图钉颜色

angular - 订阅 Observable 与订阅 Subject