ios - 如何在 Swift 的表格 View 单元格中进行有限的多重复选标记?

标签 ios swift uitableview

enter image description here

我是编程和 iOS 开发的新手,我需要制作具有多个有限复选标记的表格 View 。

我的意思是,我想允许用户在表格 View 中选择最多 3 个项目(不仅仅是 1 个,而且也不是表格 View 中的所有项目都可以选择),我已经尝试过但我还没有得到我想要什么,我只能在表格 View 中选择一个项目

这是我使用的代码

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

        }
    }



}

你能帮帮我吗?

最佳答案

您不能简单地将复选标记添加到单元格;单元格对象将在 tableview 滚动时被重新使用,因此您将丢失复选标记并最终在不应该有复选标记的单元格中出现复选标记。

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

您还需要确保您的 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)
    }
}

关于ios - 如何在 Swift 的表格 View 单元格中进行有限的多重复选标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49840805/

相关文章:

iphone - 删除 http ://from NSString

iphone - 直接从 Assets URL 读取

ios - 垃圾收集器期间的 MonoTouch SIGSEGV 在 ABPeoplePickerNavigationController 上启动 Dispose

ios - swift3 中的数据到 Int/String

ios - CoreData 排序故障

iphone - 使用 UITableViewCellStyleValue2 样式的多行 UITableViewCell

ios - 按下按钮时激活 TextField

ios - Swift TableView 删除单元格不显示

iphone - 通过 tableview 添加 View (UITableViewController)

ios - XCode8 Swift3 - 打开联系人列表并通过单击检索数据时出现问题