Swift 5.5:自定义 TableView 单元格内的 UISlider disable/enable 动画不工作

Swift 5.5: UISlider disable/enable animation inside custom TableView cell not working

我使用 XIB 文件创建了一个自定义 UITableviewCell 实现,并在其中添加了一个 UISlider,我希望在第一次加载单元格时将其禁用,并在我从 table 单元格。 我通过按钮操作将 Slider 的“isEnabled”属性 设置为 True。

当 tableView 第一次加载时,滑块按预期禁用,然后我单击按钮,属性 isEnabled 设置为 True,但滑块不会更改其外观,在我点击它之前它看起来仍然是灰色的。

我看到了使用 reloadTable() 的建议,但在我的情况下,这不可接受table。还有什么我可以用来“恢复生机”的 UISlider 吗?有些函数只刷新 UISlider 而不是整个 table?

通过调用 reloadTable() 重新加载整个 tableView 的替代方法是使用 reloadRows(at:with:) (docs) 重新加载受影响的行。也许这对你来说是可以接受的?

我在一些帮助下设法弄明白了。 我将单元格视为错误的数据存储,并试图将信息直接保存在单元格 class 中。取而代之的是,我被教导将单元格视为显示存储,所以现在我使用 TableCell 结构,在其中存储每个单元格的配置,然后我使用函数 cellForRowAt 每次使用此信息更新单元格。 在我的具体情况下,我使用 reloadRows(at:with:) 重新加载单元格,但我没有设置它。顺便说一句,当调用 reloadRows(at:with:) 时,你实际上也调用了 cellForRowAt

struct TableCellData {
//Whatever data you may have in your cell and needs an update when it's displayed goes here
var sliderOn: Bool = false
....
}

Custom Cell class 及其协议。我正在使用具有三个值的 UISegmentedControl,对于它的第一个值,我禁用了 UISlider

protocol CellDelegate{
    func didUpdateSegment(at index:IndexPath, sliderOn: Bool)
}

class Cell: UITableViewCell {
var delegate: CellDelegate?
var cellIndexPath: IndexPath?

@IBOutlet weak var cellSlider: UISlider!

@IBAction func segmentPressed(_ sender: UISegmentedControl) {
    var sliderOn: Bool = false
    switch segment.selectedSegmentIndex {
    case 0:
        sliderOn = false
    case 1:
        sliderOn = true
    case 2:
        sliderOn = true
    default:
        sliderOn = false
    }
    if let safeCellIndexPath = cellIndexPath {
        self.delegate?.didUpdateSegment(at: safeCellIndexPath, sliderOn: sliderOn)
    }
}

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    segment.selectedSegmentIndex = 0
}

在你的 ViewController 中,你应该有你的 cellData 数组,你应该在 viewDidLoad() 或其他地方用 table 单元格行的确切数量初始化它。我不会在这里包括这部分,但它应该类似于 cellData = Array(repeating: TableCellData(), count: nbOfTableItems)

class ViewController: UIViewController {
    ....
    var cellData : [TableCellData] = []
    ....
}

然后在你的 CellDelegate 扩展中:

extension ViewController: CellDelegate {
   func didUpdateSegment(at index: IndexPath, sliderOn: Bool)  {
      cellData[index.row].sliderOn = sliderOn
      myTableView.reloadRows(at: [index], with: .none)
}

在 cellForRowAt 函数中:

extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCellName", for: indexPath) as! Cell
        
        cell.delegate = self
        cell.cellIndexPath = indexPath
        //isEnabled property did not work for me so I use the following to enabled/disable the UISLider of a cell
        cell.cellSlider.isUserInteractionEnabled = cellData[indexPath.row].sliderOn
        cell.cellSlider.alpha = cellData[indexPath.row].sliderOn == true ? 1.0 : 0.5
    }