如何在 Swift 2.0 中的 TableView 中获取选中标记的项目

Posted

技术标签:

【中文标题】如何在 Swift 2.0 中的 TableView 中获取选中标记的项目【英文标题】:How to get checkmarked items in TableView in Swift 2.0 【发布时间】:2015-11-30 10:01:22 【问题描述】:

我想在我的tableView 中获得一个检查标记的项目,但我找不到任何解决方案。我尝试使用NSArray,但它因'Array out of bounds' 错误而崩溃,它会导致崩溃,因为当我想在indexPath 删除时,它没有该索引并且它崩溃所以我决定使用无序集合Dictionary 一样,但这次它不会完全删除选定的 indexPath 中的项目。我的TableView 中有我的代码。

let services = ["1", "2", "3"]
var selectedServices = [Int: String]()
var selectedServicesArray = [String]()

@IBOutlet weak var saveButtonOutlet: UIButton!
// MARK: - LifeCycle

override func viewDidLoad() 
    super.viewDidLoad()
    DesignSettings().clipComponents([saveButtonOutlet])


// MARK: - TableView DataSource & Delegate Methods

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return services.count


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    if let selectedRow = tableView.cellForRowAtIndexPath(indexPath) 
        if selectedRow.accessoryType == .None 
            selectedRow.accessoryType = .Checkmark
            selectedServices[indexPath.row] = selectedRow.textLabel?.text
         else 
            selectedRow.accessoryType = .None
            selectedServices.removeValueForKey(indexPath.row)
        
    
    for (_, value) in selectedServices 
        self.selectedServicesArray.append(value)
    


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = self.tableView.dequeueReusableCellWithIdentifier(Constants.CellIdentifier, forIndexPath: indexPath)
    cell.textLabel?.text = services[indexPath.row]

    return cell

还有console 打印;

["1", "1", "2"]
["3"]
["2", "3", "2"]
["2", "1", "1", "2", "3", "1", "2"]

我该如何解决这个问题? 在 tableView 中检查标记项目的正确方法是什么? 谢谢!

【问题讨论】:

【参考方案1】:

有两个问题:

你在for 循环中不断地append-ing 到selectedServicesArray。要解决此问题,您必须删除所有对象,然后添加所有选定对象。

您正在使用中间对象来处理选定的值,我建议直接向 selectedServicesArray 添加/删除项目,如下所示:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    if let selectedRow = tableView.cellForRowAtIndexPath(indexPath) 
        if selectedRow.accessoryType == .None 
            selectedRow.accessoryType = .Checkmark
            selectedServicesArray.append((selectedRow.textLabel?.text)!)
         else 
            selectedRow.accessoryType = .None

            let indexToDelete = selectedServicesArray.indexOf((selectedRow.textLabel?.text)!)
            selectedServicesArray.removeAtIndex(indexToDelete!)
        
    

【讨论】:

让 indexToDelete = selectedServicesArray.indexOf((selectedRow.textLabel?.text)!) selectedServicesArray.removeAtIndex(indexToDelete!) 是诀窍谢谢。它现在完美运行。如何在我的 tableView 中勾选 selectedServices 项? 没问题,但我没完全明白你的问题,你想在选定的单元格上添加复选标记吗? 我会将这些数据存储到 Parse,当我从 Parse 获取这些数据时,有时我想在我的 tableView 中显示存储的服务(selectedServices)并带有复选标记。 将此添加到您的cellForRowAtIndexPath if selectedServicesArray.contains((selectedRow.textLabel?.text)!) selectedRow.accessoryType = .Checkmark else selectedRow.accessoryType = .None 它有效,谢谢。当我想在 tableView 中选中另一个项目时,它会删除我的数组中的其他选中标记项目并仅添加新的选定项目。例如:我选中标记并将“1”和“2”添加到我的 selectedServicesArray 它显示带有复选标记的项目。当我选中标记为“3”时,它显示了 3 个已检查的项目,但它仅将最后一个项目添加到我的 selectedServicesArray 中,它会删除最后 2 个项目的任何解决方案?【参考方案2】:

首先不明白你为什么需要selectedServicesArray 以及你的问题到底是什么。您应该始终展示您的 3 项服务吗?在您的代码中,您修改了selectedServicesselectedServicesArray,但在numberOfRowsInSection 中始终为services.count - 3。所以这很奇怪。并且您在更改复选标记后没有更新您的 tableView。所以我提供了一些代码:

let services = ["1", "2", "3"]
var selectedServices = [Int: Bool]()

// MARK: - TableView DataSource & Delegate Methods

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return services.count


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    if let selectedRow = tableView.cellForRowAtIndexPath(indexPath) 
        if selectedRow.accessoryType == .None 
            selectedRow.accessoryType = .Checkmark
            selectedServices[indexPath.row] = true
         else 
            selectedRow.accessoryType = .None
            selectedServices[indexPath.row] = false
        
    
    tableView.reloadData()


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = self.tableView.dequeueReusableCellWithIdentifier(Constants.CellIdentifier, forIndexPath: indexPath)

    // check selectedServices[indexPath.row] and update your layout

    return cell

【讨论】:

Parse.com 需要 NSArray 来存储这些数据,所以我添加了 selectedServicesArray 并希望将 selectedServices 附加到这个数组中,以便我可以将这个数组存储到 Parse.com。

以上是关于如何在 Swift 2.0 中的 TableView 中获取选中标记的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 2.0 中的 TableView 中获取选中标记的项目

处理 Swift 2.0 中的转换错误

Swift - 如何实现默认视图控制器循环

使用 Swift 2.0 解析并跳转到 JSON 文件中的下一个块

Swift:如何使用编辑按钮删除并停用滑动删除?

swift 2.0(XCode 7 beta 5)中的拆分方法