Zach Wilcox
Zach Wilcox

Reputation: 445

RangeSlider inside of table fails to show value

I have a range slider embedded inside of a table view. When I adjust the slider, it moves at expected however the sliders label and the value of the slider itself does not show. Below is how I have my slider range cell set up.

import UIKit

class MileRangeCell: UITableViewCell {

let mileSlider: UISlider = {
    let slider = UISlider()
    slider.minimumValue = 1
    slider.maximumValue = 25
    slider.tintColor = GREEN_Theme
    return slider
}()

let mileLabel: UILabel = {
    let label = mileRangeLabel()
    label.text = "Miles"
    return label
}()

class mileRangeLabel: UILabel {
    override var intrinsicContentSize: CGSize {
        return .init(width: 80, height: 0)
    }
}

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    contentView.isUserInteractionEnabled = true
    
    let mileStackView = UIStackView(arrangedSubviews: [
        UIStackView(arrangedSubviews: [mileLabel, mileSlider])])
    mileStackView.axis = .vertical
    mileStackView.spacing = 16
    addSubview(mileStackView)
    mileStackView.anchor(top: topAnchor, leading: leadingAnchor, bottom: bottomAnchor, trailing: trailingAnchor, padding: .init(top: 16, left: 16, bottom: 16, right: 16))
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

And below, is how I planned on accessing the values of the slider after a user interacts with it inside of the table view cell.

  @objc fileprivate func handleMileChange(slider: UISlider) {
    evaluateMile()
}

 fileprivate func evaluateMile() {
    guard let mileRangeCell = tableView.cellForRow(at: [1, 0]) as? MileRangeCell else { return }
    let mileValue = Int(mileRangeCell.mileSlider.value)
    mileRangeCell.mileSlider.value = Float(mileValue)
    mileRangeCell.mileLabel.text = "Miles \(mileValue)"
    user?.mileRange = mileValue
}

static let defaultMile = 1

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
     let mileRangeCell = MileRangeCell(style: .default, reuseIdentifier: nil)
         mileRangeCell.mileSlider.addTarget(self, action: #selector(handleMileChange), for: .valueChanged)
        let mile = user?.mileRange ?? SettingsViewController.defaultMile
        mileRangeCell.mileLabel.text = "Miles \(mile)"
        mileRangeCell.mileSlider.value = Float(mile)
        print(mile)
        return mileRangeCell
    }
 } 

Any idea on how to fix?

Upvotes: 0

Views: 24

Answers (1)

Zach Wilcox
Zach Wilcox

Reputation: 445

Seconds after finishing this, I figured out that the issue was because I had set the incorrect index.

guard let mileRangeCell = tableView.cellForRow(at: [1, 0]) as? MileRangeCell else { return }

should have been

guard let mileRangeCell = tableView.cellForRow(at: [0, 0]) as? MileRangeCell else { return }

Upvotes: 0

Related Questions