Firestore - UISlider внутри UITableViewCell

У меня есть UISlider внутри настраиваемых ячеек tableView. В ячейке также есть UILabel, отображающий значение ползунков. На данный момент у меня есть это, так что я могу обновить значение ползунков до firestore, а также в ярлыке. Однако, когда я ухожу с экрана / приложения и снова загружаю экран, я не могу загрузить предыдущее значение ползунков в ползунок. Я все еще могу обновить значение ползунков, и оно все равно будет перенесено в firestore, и все работает хорошо. Я попытался загрузить значение из firestore в ползунок при первом запуске экрана, который работает отлично, но он не позволяет мне обновлять ползунок на экране, когда я это делаю, но он обновляется в firestore. Было бы идеально, если бы данные загружались из хранилища огня при первой загрузке экрана, а затем я могу обновить ползунок, и он будет работать в приложении и в хранилище огня. Любая помощь будет принята с благодарностью! Большое спасибо!!

ViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

    cell.slider.tag = indexPath.row
    cell.slider.addTarget(self, action: #selector(ViewController.sliderChange(sender:)), for: .valueChanged)

    cell.sliderLabel.text = String(Int(cell.slider.value))

    // code that loads values when screen is first launched but then doesn't let me update the onscreen values
    cell.slider.value = Float(array[indexPath.row].number)

    return cell
}

 @objc func sliderChange(sender: UISlider) {
    let currentValue = Int(sender.value)
    let row = sender.tag
    let Id = array[row].documentID

    let userRef = db.collection("Users").document(user!)
    userRef.collection("Friends").document(Id).updateData(["number" : currentValue]) {
        error in
        if let error = error {
            print("Error adding document: \(error.localizedDescription)")
        } else {
            print(currentValue)
        }
    }

    self.tableView.reloadData()

}

TableViewCell

class TableViewCell: UITableViewCell {

@IBOutlet weak var sliderLabel: UILabel!
@IBOutlet weak var slider: UISlider!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

person WH48    schedule 09.06.2018    source источник


Ответы (1)


Выполните рефакторинг метода для этого, обратите внимание, что код обновления является асинхронным, вы должны отразить измененные данные в массиве источника данных таблицы и перезагрузить таблицу внутри ее успешной части.

 @objc func sliderChange(sender: UISlider) {

    let currentValue = Int(sender.value)
    let row = sender.tag
    let Id = array[row].documentID

    let userRef = db.collection("Users").document(user!)
    userRef.collection("Friends").document(Id).updateData(["number" : currentValue]) {
        error in
        if let error = error {
            print("Error adding document: \(error.localizedDescription)")
        } else {
            print(currentValue)
            array[indexPath.row].number = sender.value // set it according to type of number property 
            self.tableView.reloadData()  
        }

    }

}
person Sh_Khan    schedule 09.06.2018
comment
Прекрасно работает! Большое спасибо!! ???? - person WH48; 09.06.2018