2017-06-21 68 views
0

我在單元格中有一個按鈕作爲切換到俱樂部成員的切換。當我檢查一個成員時,我需要按鈕的狀態在滾動後保持ON狀態,但它會關閉。這裏是cellForRow方法:iOS Swift:在單元格中維護切換按鈕狀態

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 
} 

下面是在自定義單元格級,我切換按鈕

@IBOutlet weak var checkBtn: UIButton! 
@IBAction func setAttendance(_ sender: Any){ 
    // toggle state 
    checkBtn.isSelected = !checkBtn.isSelected 
} 

對觸發的作品,但滾動表,按鈕狀態更改回原來的後部分。任何建議表示讚賞。

回答

0

Shamas強調了一個正確的方法來做到這一點,所以我會分享我的整個解決方案。

我創建一個單獨的類來存儲檢查單元的陣列:

class Utility { 

// Singleton 
private static let _instance = Utility() 
static var Instance: Utility{ 
    return _instance 
} 

var checkedCells = [Int]() 

在定製單元I類已經操作方法連接到複選按鈕來添加和刪除檢查細胞:

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

發生這種情況是因爲您正在重複使用單元格。

您需要跟蹤選擇了哪些單元格。也許在你的成員班裏。然後當你在你的cellForRowAt你應該檢查這個單元格是否已被選中,併爲你的按鈕設置正確的狀態。

+0

謝謝你的幫助,這是一個正確的方法,但實際的代碼有點涉及,所以我總是做出正確的答案是完整的答案。我因爲這個原因接受了我的回答。再次感謝你。 – fullMoon

0

的問題是這裏:每單元被配置委託cellForRowAt時調用時間

checkBtn.isSelected = !checkBtn.isSelected 

此代碼將反映所述按鈕選擇的狀態。所以如果您之前選擇了它,現在它變成未選中。

2

這是因爲tableview重用了你的單元格。所以你必須按照tableView數據源維護按鈕。

0

由於tableView重複使用單元格,您的代碼無法工作。 您必須在選中時跟蹤每個按鈕,並在滾動時tableview重用單元格時再次設置它。 解決方案:您可以使用一個數組(包含bool),它是您的tableview數據的大小。 所以你必須設置狀態的按鈕使用數組和更新數組時選擇或取消選擇。