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
}
我使用 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
}