iOS Swift: 在单元格中维护切换按钮状态
iOS Swift: Maintaining Toggle Button State In A Cell
我在单元格中有一个按钮作为切换按钮,用于签入俱乐部中的成员。当我登记会员时,我需要按钮的状态在滚动后保持打开状态,但它又会关闭。这是 cellForRow 方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.membersTableVw.dequeueReusableCell(withIdentifier: "CellMembersForCoach", for: indexPath) as! CellMembersForCoach
let member = members[indexPath.row]
cell.setMember(member)
cell.cellController = self
return cell
}
这是自定义单元格 class 中我切换按钮的部分
@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
// toggle state
checkBtn.isSelected = !checkBtn.isSelected
}
切换有效,但在滚动 table 后,按钮状态变回原始状态。任何建议表示赞赏。
发生这种情况是因为您重复使用了单元格。
您需要跟踪哪些单元格已被选中。也许在您的会员 class 中。然后,当您在 cellForRowAt
中时,您应该检查之前是否已选择此单元格并为您的按钮设置正确的状态。
问题在这里:
checkBtn.isSelected = !checkBtn.isSelected
每当委托 cellForRowAt
调用时,每次配置单元格时,此代码都会反映按钮选择状态。所以如果你之前选择了它,现在变成未选择。
这是因为 tableview 正在重复使用您的单元格。所以你必须根据 tableView 数据源维护按钮。
由于 tableView 正在重复使用单元格,因此您的代码将无法正常工作。
您必须在选择时跟踪每个按钮,并在滚动时 tableview 重用单元格时再次设置它。
解决方案:您可以采用一个数组(包含布尔值),它是您的表视图数据的大小。
所以你必须使用数组设置按钮的状态,并在选择或取消选择时更新数组。
Shamas 强调了一个正确的方法,所以我将分享我的整个解决方案。
我创建了一个单例 class 来存储一组选中的单元格:
class Utility {
// Singleton
private static let _instance = Utility()
static var Instance: Utility{
return _instance
}
var checkedCells = [Int]()
在自定义单元格中 class 我将操作方法连接到检查按钮以添加和删除选中的单元格:
@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
// Get cell index
let indexPath :NSIndexPath = (self.superview! as! UITableView).indexPath(for: self)! as NSIndexPath
if !checkBtn.isSelected{
Utility.Instance.checkedCells.append(indexPath.row)
}else{
// remove unchecked cell from list
if let index = Utility.Instance.checkedCells.index(of: indexPath.row){
Utility.Instance.checkedCells.remove(at: index)
}
}
// toggle state
checkBtn.isSelected = !checkBtn.isSelected
}
在视图控制器的 cellForRowAt 方法中,我检查单元格行是否在数组中并决定是否应检查切换按钮:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.membersTableVw.dequeueReusableCell(withIdentifier: "CellMembersForCoach", for: indexPath) as! CellMembersForCoach
if Utility.Instance.checkedCells.contains(indexPath.row){
cell.checkBtn.isSelected = true
}
return cell
}
我在单元格中有一个按钮作为切换按钮,用于签入俱乐部中的成员。当我登记会员时,我需要按钮的状态在滚动后保持打开状态,但它又会关闭。这是 cellForRow 方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.membersTableVw.dequeueReusableCell(withIdentifier: "CellMembersForCoach", for: indexPath) as! CellMembersForCoach
let member = members[indexPath.row]
cell.setMember(member)
cell.cellController = self
return cell
}
这是自定义单元格 class 中我切换按钮的部分
@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
// toggle state
checkBtn.isSelected = !checkBtn.isSelected
}
切换有效,但在滚动 table 后,按钮状态变回原始状态。任何建议表示赞赏。
发生这种情况是因为您重复使用了单元格。
您需要跟踪哪些单元格已被选中。也许在您的会员 class 中。然后,当您在 cellForRowAt
中时,您应该检查之前是否已选择此单元格并为您的按钮设置正确的状态。
问题在这里:
checkBtn.isSelected = !checkBtn.isSelected
每当委托 cellForRowAt
调用时,每次配置单元格时,此代码都会反映按钮选择状态。所以如果你之前选择了它,现在变成未选择。
这是因为 tableview 正在重复使用您的单元格。所以你必须根据 tableView 数据源维护按钮。
由于 tableView 正在重复使用单元格,因此您的代码将无法正常工作。 您必须在选择时跟踪每个按钮,并在滚动时 tableview 重用单元格时再次设置它。 解决方案:您可以采用一个数组(包含布尔值),它是您的表视图数据的大小。 所以你必须使用数组设置按钮的状态,并在选择或取消选择时更新数组。
Shamas 强调了一个正确的方法,所以我将分享我的整个解决方案。
我创建了一个单例 class 来存储一组选中的单元格:
class Utility {
// Singleton
private static let _instance = Utility()
static var Instance: Utility{
return _instance
}
var checkedCells = [Int]()
在自定义单元格中 class 我将操作方法连接到检查按钮以添加和删除选中的单元格:
@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
// Get cell index
let indexPath :NSIndexPath = (self.superview! as! UITableView).indexPath(for: self)! as NSIndexPath
if !checkBtn.isSelected{
Utility.Instance.checkedCells.append(indexPath.row)
}else{
// remove unchecked cell from list
if let index = Utility.Instance.checkedCells.index(of: indexPath.row){
Utility.Instance.checkedCells.remove(at: index)
}
}
// toggle state
checkBtn.isSelected = !checkBtn.isSelected
}
在视图控制器的 cellForRowAt 方法中,我检查单元格行是否在数组中并决定是否应检查切换按钮:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.membersTableVw.dequeueReusableCell(withIdentifier: "CellMembersForCoach", for: indexPath) as! CellMembersForCoach
if Utility.Instance.checkedCells.contains(indexPath.row){
cell.checkBtn.isSelected = true
}
return cell
}