我已經使用 XIB 檔案創建了一個自定義 UITableviewCell 實作,并在其中添加了一個 UISlider,我希望在第一次加載單元格時禁用它,并在我單擊表格單元格中的按鈕時啟用它。我使用按鈕操作將 Slider 的“isEnabled”屬性設定為 True。
當 tableView 第一次加載時,滑塊按預期禁用,然后我單擊按鈕,屬性 isEnabled 設定為 True 但滑塊不會改變它的外觀,它仍然看起來是灰色的,直到我單擊它。
我已經看到使用 reloadTable() 的建議,但在我的情況下這是不可接受的。還有什么我可以用來“復活” UISlider 的東西嗎?某些僅重繪 UISlider 而不是整個表的功能?
uj5u.com熱心網友回復:
tableView通過呼叫重新加載整體的另一種方法reloadTable()是使用reloadRows(at:with:)( docs )重新加載受影響的行。也許這在您的情況下是可以接受的?
uj5u.com熱心網友回復:
在一些幫助下,我設法弄清楚了。我將單元格視為錯誤的資料存盤,并試圖將資訊直接保存在單元格類中。取而代之的是,我被教導將單元格視為顯示存盤,因此現在我使用 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)
}
在 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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409548.html
標籤:
上一篇:UICollectionViewCompositionalLayout的可重用標頭
下一篇:表格節標題的分隔符插入
