Firestore - UISlider внутри UITableViewCell - PullRequest
0 голосов
/ 09 июня 2018

У меня есть UISlider внутри пользовательских ячеек tableView.В ячейке также есть UILabel, отображающая значение ползунков.На данный момент у меня есть его, так что я могу обновить значение ползунков в Firestore, а также в метку.Однако, когда я выхожу из экрана / приложения и загружаю экран снова, я не могу загрузить предыдущее значение ползунка в ползунок.Я все еще могу обновить значение ползунков, и оно все равно будет перенесено в Firestore, и все работает хорошо.Я попытался загрузить значение из 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
}

1 Ответ

0 голосов
/ 09 июня 2018

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

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

    }

}
...