2016-03-10 60 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