Swift 5.5:UISlider禁用/启用自定义TableView单元格内的动画不起作用



我使用XIB文件创建了一个自定义UITableviewCell实现,并在其中添加了一个UISlider,我希望在第一次加载单元格时禁用它,并在单击表单元格中的按钮时启用它。我设置了";isEnabled";属性设置为True。

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

我看到了使用reloadTable((的建议,但在我的情况下,这是不可接受的。还有什么我可以用来";让生命复活";UISlider?某个函数只刷新UISlider而不是整个表?

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

我在一些帮助下设法解决了这个问题。我认为单元格是一个错误的数据存储,并试图直接将信息保存在单元格类中。相反,我被教导将单元格视为显示存储,所以现在我使用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
....
}

自定义Cell类及其协议。我使用了一个有三个值的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((或其他地方初始化该数组,并使用表单元格行的确切数量。我不会在这里包括这一部分,但它应该是类似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)
}

在单元格中ForRowAt函数:

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
}

最新更新