2016-03-10 38 views
0

我已阅读了类似的问题,但我一直无法解决它。我有一个tableview,它有一个自定义单元格和一个按钮来添加和删除一个类。我创建了一个自定义委托来保存和删除类,并更改按钮的状态。改变按钮的状态工作正常,但是当我滚动按钮不保持状态(我猜是因为我正在退出单元格)UITableViewCell不保持自定义按钮的状态

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

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 
    } 
    } 
} 

它改变了按钮的状态,但是当我开始向上或向下滚动按钮不保持状态(我知道可能是因为我正在修改我的ce所以它会使用任何可用的单元。任何帮助是极大的赞赏。

此外,我在我的视图控制器的故事板内有我的手机。为什么如果我做cell = PresentationCell(),我的单元格中的所有视图都是零?我只是试图不重用细胞作为我的最后一个解决方案。

+0

TableView单元不保持状态。在您滚动时,它将重新使用不再在屏幕上的现有单元格。您需要维护单元格外的状态,并在'tableView:cellForRowAtIndexPath:'中从头开始设置每个单元格。 – Michael

+0

我需要不重用细胞?你是这个意思吗? –

+1

不,你必须重用单元格,因为这就是UITableView的工作原理。由于它们将被重用,因此您需要的任何状态都必须保持在单元之外。 – Michael

回答

0

溶液由@迈克尔:“你需要必须在细胞外保持任何状态来“因为tableView重用已经创建的单元格,我必须添加一个属性到类Im填充tableview(我用一个布尔,但它可以是任何东西),并基于该属性我设置按钮的状态方法cellForRowAtIndexPath。

2

可重复使用的表格视图单元格不保留状态,以便让按钮处于保持状态时,您必须根据条件进行另一次检查,当单元格出现在屏幕上时。 我的建议是实施

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

} 

我希望这会有所帮助。

+0

我在prepareForReuse方法中添加了addRemoveButton.selected = false,并且每次滚动视图时都会调用它,但问题仍然存在。 –

0

你应该做两件事情

  1. 覆盖“prepareForReuse”在你的UITableViewCell子类重置 的实现代码如下细胞的一些默认状态的tableView
  2. :的cellForRowAtIndexPath:将dequeu可重复使用的电池。 由于该单元正在被重新使用,并且可能已经与不同的indexPath相关联,因此您必须重新对其进行重新配置。 在你的情况,你会设置按钮的状态,以反映 indexPath你即将到小区分配到
+0

哟意味着什么“您将设置按钮的状态以反映您将要指定单元格的indexPath”?我认为这是我在做什么,当我检查isInSchedule变量(请参阅我的代码在原来的帖子) –

+0

不,该代码是在cellForRowAtIndexpath –

+0

它看起来像你使用的核心数据。是否有可能您的更改没有被正确保存?我没有那么多的快速体验,但是你所做的改变可能不会持续下去。 – habs93