UITableViewCell 不保存自定义按钮的状态
UITableViewCell does not hold the state of custom button
我看过类似的问题,但一直没能解决。我有一个 tableview,它有一个带有按钮的自定义单元格,用于添加和删除 class。我创建了一个自定义委托来保存和删除 class,并更改按钮的状态。更改按钮的状态可以正常工作,但是当我滚动时按钮不保持状态(我猜是因为我正在使单元格出列)
在我的索引路径行的单元格中,我尝试检查以更改按钮的状态:
let isInSchedule = self.isClassScheduled(classAttend, from: self.classesInSchedule!)
if isInSchedule == true {
cell.addRemoveButton.selected = true
} else {
cell.addRemoveButton.selected = false
}
这是我的委托方法,我在其中保存或删除 class
func indexOfClassSelectedWithButton(index: NSIndexPath, tableView:UITableView, and button: AddRemoveClass) {
if let currentlySavedClasses = ManagedObjectsController.sharedInstance.getAllScheduledClasses() as? [ClassScheduled] {
let classSelected = self.classes[index.section]
switch button.selected {
case true:
for classItem in currentlySavedClasses {
if classSelected.presentation?.title == classItem.presentation?.valueForKey("title") as? String {
ManagedObjectsController.sharedInstance.deleteScheduledClass(classItem)
button.selected = false
}
}
break
default:
if let classSelectedBreakout = classSelected.breakout?.valueForKey("breakoutID") as? String {
let canSave = self.isBreakoutAvailable(classSelectedBreakout, allClasses: currentlySavedClasses)
if canSave {
ManagedObjectsController.sharedInstance.createScheduledClass(from: classSelected)
button.selected = true
} else {
NSNotificationCenter.defaultCenter().postNotificationName(timeConlictNotication, object: nil)
}
}
break
}
}
}
它改变了按钮状态,但是当我开始向上或向下滚动时,按钮不保持状态(我知道可能是因为我正在修改我的单元格,所以它占用了任何可用的单元格. 非常感谢任何帮助。
此外,我在故事板的视图控制器中有我的单元格。为什么如果我执行 cell = PresentationCell(),我的单元格中的所有视图都是零?我只是想不重复使用该单元格作为我的最后一个解决方案。
可重用 table 视图单元格不保持状态,因此要保持按钮保持状态,您必须根据您的情况再次检查单元格何时出现在屏幕上。
我的建议是实施
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if isInSchedule == true {
cell.addRemoveButton.selected = true
} else {
cell.addRemoveButton.selected = false
}
}
另一件事是在自定义单元格中通过实现 "prepareForReuse" 记住单元格的重置状态。
override func prepareForReuse() {
}
希望对您有所帮助。
你应该做两件事
- 重写 UITableViewCell 子类中的 "prepareForReuse" 以重置
tableview 单元格到一些默认状态
- in tableView:cellForRowAtIndexPath:将使可重复使用的单元出队。
由于该单元正在被重新使用并且可能已经被
与不同的 indexPath 关联,您必须重新配置它。
在您的情况下,您将设置按钮的状态以反映
您要将单元格分配给的 indexPath
解决方案来自@Michael“您需要的任何状态都必须在单元格之外维护”,因为 tableView 重用了已经创建的单元格我不得不添加一个 属性 到 class 我用(我使用了一个 bool 但它可以是任何东西)填充 tableview 并基于它 属性 我在 cellForRowAtIndexPath 方法中设置按钮的状态。
我看过类似的问题,但一直没能解决。我有一个 tableview,它有一个带有按钮的自定义单元格,用于添加和删除 class。我创建了一个自定义委托来保存和删除 class,并更改按钮的状态。更改按钮的状态可以正常工作,但是当我滚动时按钮不保持状态(我猜是因为我正在使单元格出列)
在我的索引路径行的单元格中,我尝试检查以更改按钮的状态:
let isInSchedule = self.isClassScheduled(classAttend, from: self.classesInSchedule!)
if isInSchedule == true {
cell.addRemoveButton.selected = true
} else {
cell.addRemoveButton.selected = false
}
这是我的委托方法,我在其中保存或删除 class
func indexOfClassSelectedWithButton(index: NSIndexPath, tableView:UITableView, and button: AddRemoveClass) {
if let currentlySavedClasses = ManagedObjectsController.sharedInstance.getAllScheduledClasses() as? [ClassScheduled] {
let classSelected = self.classes[index.section]
switch button.selected {
case true:
for classItem in currentlySavedClasses {
if classSelected.presentation?.title == classItem.presentation?.valueForKey("title") as? String {
ManagedObjectsController.sharedInstance.deleteScheduledClass(classItem)
button.selected = false
}
}
break
default:
if let classSelectedBreakout = classSelected.breakout?.valueForKey("breakoutID") as? String {
let canSave = self.isBreakoutAvailable(classSelectedBreakout, allClasses: currentlySavedClasses)
if canSave {
ManagedObjectsController.sharedInstance.createScheduledClass(from: classSelected)
button.selected = true
} else {
NSNotificationCenter.defaultCenter().postNotificationName(timeConlictNotication, object: nil)
}
}
break
}
}
}
它改变了按钮状态,但是当我开始向上或向下滚动时,按钮不保持状态(我知道可能是因为我正在修改我的单元格,所以它占用了任何可用的单元格. 非常感谢任何帮助。
此外,我在故事板的视图控制器中有我的单元格。为什么如果我执行 cell = PresentationCell(),我的单元格中的所有视图都是零?我只是想不重复使用该单元格作为我的最后一个解决方案。
可重用 table 视图单元格不保持状态,因此要保持按钮保持状态,您必须根据您的情况再次检查单元格何时出现在屏幕上。 我的建议是实施
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if isInSchedule == true {
cell.addRemoveButton.selected = true
} else {
cell.addRemoveButton.selected = false
}
}
另一件事是在自定义单元格中通过实现 "prepareForReuse" 记住单元格的重置状态。
override func prepareForReuse() {
}
希望对您有所帮助。
你应该做两件事
- 重写 UITableViewCell 子类中的 "prepareForReuse" 以重置 tableview 单元格到一些默认状态
- in tableView:cellForRowAtIndexPath:将使可重复使用的单元出队。 由于该单元正在被重新使用并且可能已经被 与不同的 indexPath 关联,您必须重新配置它。 在您的情况下,您将设置按钮的状态以反映 您要将单元格分配给的 indexPath
解决方案来自@Michael“您需要的任何状态都必须在单元格之外维护”,因为 tableView 重用了已经创建的单元格我不得不添加一个 属性 到 class 我用(我使用了一个 bool 但它可以是任何东西)填充 tableview 并基于它 属性 我在 cellForRowAtIndexPath 方法中设置按钮的状态。