Reputation: 445
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
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