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

时间:2015-11-30 10:01:22

标签: ios arrays swift uitableview dictionary

我希望在我的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中获取检查标记项的正确方法是什么? 谢谢!

2 个答案:

答案 0 :(得分:1)

首先不明白你为什么需要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
}

答案 1 :(得分:1)

有2个问题:

  • 您经常append - selectedServicesArray循环中的for。要解决此问题,您必须删除所有对象,然后添加所有选中的内容。

  • 您正在使用中间对象来处理所选的值,我建议直接在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!)
            }
        }
    }