UITableViewCell 不保存自定义按钮的状态

Posted

技术标签:

【中文标题】UITableViewCell 不保存自定义按钮的状态【英文标题】:UITableViewCell does not hold the state of custom button 【发布时间】:2016-03-10 01:16:33 【问题描述】:

我已经阅读了类似的问题,但我无法解决它。我有一个表格视图,它有一个带有按钮的自定义单元格来添加和删除一个类。我创建了一个自定义委托来保存和删除类,并更改按钮的状态。更改按钮的状态可以正常工作,但是当我滚动按钮时不会保持状态(我猜是因为我正在使单元格出列)

在我的单元格中的索引路径行中,我尝试检查以更改按钮的状态:

let isInSchedule = self.isClassScheduled(classAttend, from: self.classesInSchedule!)
    if isInSchedule == true 
        cell.addRemoveButton.selected = true

     else 
        cell.addRemoveButton.selected = false
    

这是我保存或删除类的委托方法

 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() 我的单元格中的所有视图都为零?我只是想不重用单元格作为我最后的解决方案。

【问题讨论】:

TableView 单元格不保持状态。当您滚动时,它将重用不再出现在屏幕上的现有单元格。您需要在单元格外部维护状态,并在tableView:cellForRowAtIndexPath: 中从头开始设置每个单元格。 我不需要重复使用单元格?你是这个意思吗? 不,您必须重复使用单元格,因为这就是 UITableView 的工作方式。由于它们将被重复使用,因此您需要的任何状态都必须在单元格之外维护。 谢谢!诀窍是像你说的那样,保持单元格外按钮的状态。我向填充单元格的对象添加了一个布尔属性,并基于该属性设置按钮的状态。再次感谢您 【参考方案1】:

可重复使用的表格视图单元格不会保持状态,因此要保持按钮保持其状态,您必须根据您的条件再次检查单元格何时出现在屏幕上。 我的建议是实施

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() 


我希望这会有所帮助。

【讨论】:

我在 prepareForReuse 方法中添加了 addRemoveButton.selected = false ,每次滚动视图时都会调用它,但问题仍然存在。【参考方案2】:

你应该做两件事

    覆盖 UITableViewCell 子类中的“prepareForReuse”以重置 表格视图单元格到某个默认状态 在 tableView:cellForRowAtIndexPath: 中将出列一个可重复使用的单元格。 由于该单元正在被重新使用并且可能已经被 与不同的 indexPath 关联,您必须重新配置它。 在您的情况下,您将设置按钮的状态以反映 indexPath 您即将分配单元格到

【讨论】:

“您将设置按钮的状态以反映您将要分配单元格的 indexPath”是什么意思?当我检查 isInSchedule 变量时,我认为这就是我正在做的事情(请参阅我在原始帖子中的代码) 看起来您正在使用核心数据。您的更改是否可能未正确保存?我在 swift 方面没有太多经验,但您所做的更改可能不会持续存在。【参考方案3】:

解决方案来自@Michael“必须在单元格之外维护您需要的任何状态”,因为 tableView 重用了已经创建的单元格我必须向类添加一个属性,我用填充 tableview (我使用了bool 但它可以是任何东西)并基于该属性我在方法 cellForRowAtIndexPath 中设置按钮的状态。

【讨论】:

这是正确的......但我在这个解决方案中看到的问题是当单元格在屏幕上不可见时,该单元格正在更新并调用方法 cellForRowAtIndexPath 来检查按钮的状态并设置你为真......那么如何解决这个问题? 我解决了,在这里查看我的答案:***.com/questions/32558003/…

以上是关于UITableViewCell 不保存自定义按钮的状态的主要内容,如果未能解决你的问题,请参考以下文章

从自定义 UitableViewCell 中保存 textField.text

用作自定义 UITableViewCell 的 XIB 中的自定义按钮不响应点击(ios7)

从自定义 uitableviewcell 内的按钮点击委托

在自定义 UITableViewCell 中动态显示按钮

是否可以在自定义 UITableViewCell 中有一个按钮,该按钮引用其中的选择器

自定义 UITableViewCell 按钮单击