如何在Swift中的Table View Cell中制作有限的多重复选标记?

时间:2018-04-15 10:16:27

标签: ios swift uitableview

enter image description here

我是编程和iOS开发的新手,我需要创建具有多个有限复选标记的表视图。

我的意思是,我希望允许用户在表格视图中选择最多3个项目(不仅仅是1,但也不能选择表格视图中的所有项目),我已经尝试但是我没有'得到了我想要的东西,我只能在表格视图中选择一个项目

这是我使用的代码

import UIKit

class CreateEventStep2VC: UIViewController {

    @IBOutlet weak var eventTypeNameLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!

    var newEvent : [String:Any]!
    var eventTypeAvailableData = [String]()
    var selectedEventTypes = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // initial value
        eventTypeNameLabel.text = ""

        // get event Type Data list from EventType data model
        eventTypeAvailableData = EventType.allValues.map { $0.toString() }
    }




}

extension CreateEventStep2VC : UITableViewDataSource {

    //MARK: - UITableViewDatasource

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "EventTypeCell", for: indexPath) as! CreateEventStep2Cell
        cell.eventTypeNames = eventTypeAvailableData[indexPath.row]
        return cell
    }

}


extension CreateEventStep2VC : UITableViewDelegate {

    //MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = .none
        }
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = .checkmark

        }
    }



}
你可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您无法简单地将复选标记添加到单元格中;单元格对象将被重新用作桌面视图滚动,因此您将丢失复选标记,并最终在不应该具有它们的单元格中使用复选标记。

您需要跟踪另一个结构中的已检查单元格;我建议使用Set<IndexPath>。您可以在tableview中允许多项选择,或者(我的偏好)在添加复选标记后取消选择该行。

您还需要确保cellForRowAt:正确设置附件类型

class CreateEventStep2VC: UIViewController {

    @IBOutlet weak var eventTypeNameLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!

    var newEvent : [String:Any]!
    var eventTypeAvailableData = [String]()
    var selectedEventTypes = Set<IndexPath>()

    override func viewDidLoad() {
        super.viewDidLoad()

        // initial value
        eventTypeNameLabel.text = ""

        // get event Type Data list from EventType data model
        eventTypeAvailableData = EventType.allValues.map { $0.toString() }
    }

}

extension CreateEventStep2VC : UITableViewDataSource {

    //MARK: - UITableViewDatasource

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "EventTypeCell", for: indexPath) as! CreateEventStep2Cell
        cell.eventTypeNames = eventTypeAvailableData[indexPath.row]
        cell.accessoryType = selectedEventTypes.contains(indexPath) ? .checkMark:.none

        return cell
    }

}


extension CreateEventStep2VC : UITableViewDelegate {

    //MARK: - UITableViewDelegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: false)
        if selectedEventTypes.contains(indexPath) {
            selectedEventTypes.remove(indexPath)
        } else if selectedEventTypes.count < 3 {
            selectedEventTypes.insert(indexPath)
        }
        tableView.reloadRows(at: [indexPath], animated:.none)
    }
}

答案 1 :(得分:0)

您可以拥有像这样的

的indexPath行数组allArr

1-当用户选择3个以上时,第一个将被自动删除

var allArr = [Int]()

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

     if let cell = tableView.cellForRow(at: indexPath) {
        cell.accessoryType = .checkmark
        allArr.append(indexPath.row)
     }

     if(allArr.count == 4)
     {
         allArr.dropFirst()

     }

}

2-将此添加到cellForRow

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "EventTypeCell", for: indexPath) as! CreateEventStep2Cell
    cell.eventTypeNames = eventTypeAvailableData[indexPath.row]

  if allArr.contains(indexPath.row)  {
       cell.accessoryType = .checkmark
   }
   else
   {
      cell.accessoryType = .none
   }
    return cell
}

3-删除didSelectRowAt

中的代码