2017-06-06 93 views
0

嘗試創建一個UITableview與包含不同部分的複選框按鈕,我如何設法爲新節中的每個按鈕分配一個唯一的標記。由於indexpath.row將在每一個新的部分被重複,不能使用indexpath.row複選框與不同部分的UITableView

+1

這是原因之一**不要**使用標籤來標識行。相反,您應該在「選中該複選框」時更新數據源。這樣,只要tableview重新加載該單元格(例如滾動後),就可以控制複選框的狀態。 – DonMag

+0

下面是一個簡單的例子 - 它使用「UISwitch」而不是「複選框」......但它將幾乎完全相同:https://stackoverflow.com/questions/44369289/swift-3-uiswitch-in-tableviewcell - 失去狀態當滾動/ 44370083#44370083 – DonMag

+0

我有UIButton,UISwitch確實有sender.isOn屬性,但只是一個UIButton與背景圖像變化 – Max

回答

0

實施例使用具有選中/取消背景圖像的UIButton具有開/關狀態:

// 
// TableWithCheckTableViewController.swift 
// SWTemp2 
// 
// Created by Don Mag on 6/6/17. 
// Copyright © 2017 DonMag. All rights reserved. 
// 

import UIKit 


class MyCheckTableViewCell: UITableViewCell { 
    @IBOutlet weak var myLabel: UILabel! 
    @IBOutlet weak var myCheckButton: UIButton! 

    var checkedImage = UIImage(named: "Checked") 
    var unCheckedImage = UIImage(named: "UnChecked") 

    var isOn: Bool = false { 
     didSet { 
      myCheckButton.setBackgroundImage(self.isOn ? checkedImage : unCheckedImage, for: .normal) 
     } 
    } 

    var checkTapAction : ((Bool)->Void)? 

    @IBAction func buttonTapped(_ sender: Any) { 

     self.isOn = !self.isOn 

     checkTapAction?(self.isOn) 
    } 


} 

// simple data object 
class MyCheckObject: NSObject { 
    var theTitle = "" 
    var theCheckState = false 

    init(_ title: String) { 
     theTitle = title 
    } 
} 

class TableWithCheckTableViewController: UITableViewController { 

    // array of MyObjects 
    var myData = [MyCheckObject]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // just to make it a little easier to see the rows scroll 
     tableView.rowHeight = 60 

     // create 40 data objects for the table 
     for i in 1...40 { 
      let d = MyCheckObject("Data Item: \(i)") 
      myData.append(d) 
     } 

     tableView.reloadData() 

    } 

    // MARK: - Table view data source 
    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return myData.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "MyCheckTableViewCell", for: indexPath) as! MyCheckTableViewCell 

     // Configure the cell... 
     let d = myData[indexPath.row] 
     cell.myLabel.text = d.theTitle 
     cell.isOn = d.theCheckState 

     // set a "Callback Closure" in the cell 
     cell.checkTapAction = { 
      (isOn) in 
      // update our Data Array to the new state of the switch in the cell 
      self.myData[indexPath.row].theCheckState = isOn 
     } 

     return cell 
    } 


} 
+0

完美!令人驚訝的是如何工作,沒有更多的設置獨特的標籤和不需要的代碼 – Max