具有不同部分的 CheckBox UITableView

Posted

技术标签:

【中文标题】具有不同部分的 CheckBox UITableView【英文标题】:CheckBox UITableView with Different Sections 【发布时间】:2017-06-06 15:04:06 【问题描述】:

尝试使用包含不同部分的复选框按钮创建 UITableview,我如何设法为新部分中的每个按钮分配唯一标签。由于 indexpath.row 将在每个新部分中重复,因此不能使用 indexpath.row

【问题讨论】:

这是使用标签来识别行的原因之一。相反,当您“选中该框”时,您应该更新您的数据源。这样,每当 tableview 重新加载该单元格时(例如,在滚动之后),您就可以控制复选框的状态。 这是一个简单的例子——它使用UISwitch而不是“复选框”...但实际上是相同的:***.com/questions/44369289/… 我有 UIButton,UISwitch 确实有 sender.isOn 属性,但是只有一个 UIButton 会改变背景图片 我假设你已经添加了一些代码或属性或其他东西来跟踪你的 UIButton 的状态? 我有点困惑,在你的一个答案中你告诉更新数据源和另一个使用按钮状态,如果我使用按钮状态,我怎么知道哪个按钮被点击我将不得不设置唯一标签。如果我再次使用数据源,我将如何知道在哪个部分和行中点击了哪些按钮数据源? 【参考方案1】:

使用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
    



【讨论】:

完美!!!令人惊奇的是它的工作原理,不再设置唯一标签和不需要的代码

以上是关于具有不同部分的 CheckBox UITableView的主要内容,如果未能解决你的问题,请参考以下文章

如何拥有两个具有两个不同高度的独立单元? [复制]

如何使父标签和子标签在b-form-checkbox上具有onclick而不重复

Word CheckBox ContentContol OnChange 事件

在具有动态高度的 IB uitableviewcell 中使用带有 XIB 的自定义视图

VB中CheckBox的使用问题。

jQuery模糊匹配checkbox全选 value实现checkbox部分或全部全选