发出从具有多个节的表中删除单行的问题(快速4)

时间:2018-09-14 05:14:07

标签: uitableview swift4 delete-row sections

我正在尝试使用commit editStyle从表中包含多个节的节中删除一行。但是,它会从上面的部分中删除正确的indexPath.row。

如何将其从适当的部分删除?

我跟随几个示例,说明如何对单个数组进行分段并为tableView对其建立索引。我无法从初始的自定义类对象数组中正确删除。我也找不到找到将IndexPath节和行转移到第二个视图控制器以显示所选代码的方法。它只是传输indexPath.row,但我无法发送它发送包括该部分在内的整个indexPath。

   func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if tableView == firstTableView {
        if editingStyle == .delete { 
            if inSearchMode == false {
                codeArray.remove(at: [indexPath.section][indexPath.row])
                userDefaults.setValue(NSKeyedArchiver.archivedData(withRootObject: codeArray), forKey: "codeArrayKey")
                userDefaults.synchronize()
                tableView.reloadData()
            }
        }
    }
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let subArrayArray = codeArray.compactMap { $0.subArray as? String }
    var dic = [String:[Code]]()
    subArrayArray.forEach {
        let subArrayKey = $0
        let filterArray = codeArray.filter { $0.subArray as? String == subArrayKey }
        dic[$0] = filterArray
    }

    let sectionTitle = sectionTitles[section]
    let sectionCodes:[Code] = dic[sectionTitle]!

    if tableView == firstTableView {
        if inSearchMode == true {
            return filteredCodeArray.count
        } else {
            return sectionCodes.count
        }
    } else if tableView == autoTableview {
        return locationFilteredCodeArray.count
    } else {
        return 1
    }
}

func numberOfSections(in tableView: UITableView) -> Int {
    if tableView == firstTableView {
        if inSearchMode == false {
            indexCodes(enterArray: codeArray)
            return sectionTitles.count
        } else if inSearchMode == true {
            return 1
        }
    }
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == firstTableView {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "newCodesProtoCell") as? NewCodesViewCell {
            let code: Code!

            if inSearchMode == true {
                code = filteredCodeArray[indexPath.row]
                cell.configureCell(code: code)
            } else {

                let subArrayArray = codeArray.compactMap { $0.subArray }
                var dic = [String:[Code]]()
                subArrayArray.forEach {
                    let subArrayKey = $0
                    let filterArray = codeArray.filter { $0.subArray == subArrayKey }
                    dic[$0] = filterArray
                }

                let sectionTitle = sectionTitles[indexPath.section]
                let sectionCodes:[Code] = dic[sectionTitle]!
                code = sectionCodes[indexPath.row]
                cell.configureCell(code: code)
            }
            return cell
        }
    }
    if let cell = tableView.dequeueReusableCell(withIdentifier: "secondNewCodesProtoCell") as? SecondNewCodesProtoCell {
        let code: Code!
        if locationFilteredCodeArray.count != 0 {
            locationAuthStatus()
            code = locationFilteredCodeArray[indexPath.row]
            cell.configureSecondCell(code: code)
        }
        return cell
    }

    return UITableViewCell()
}

这就是我获取索引名称(标题)数组的方式,因为这可能会导致某些问题。   这是为了通过.location中的第二个字母索引[Code]。

func indexCodes(enterArray: [Code]) {
    var codeValues = [String]()
    for code in enterArray {
        var initCodeKey = String(code.location.prefix(2))
        initCodeKey.remove(at: initCodeKey.startIndex)
        let codeKey = initCodeKey.capitalized
        codeValues.append(codeKey)
    }

    var encountered = Set<String>()
    var result: [String] = []
    for value in codeValues {
        if encountered.contains(value) {
        } else {
            encountered.insert(value)
            result.append(value)
        }
    }
    sectionTitles = result.sorted(by: <)
}

1 个答案:

答案 0 :(得分:0)

您需要执行2个步骤。 1.从codeArray中,从indexPath.section获取字典,然后从保存在该字典中的[Code]中获取Code对象。删除indexPath.row上的代码,然后将其保留给字典并替换CodeArray中的字典对象 2. self.tableView.reloadRows(at:[IndexPath(row:0,section:0)],带有:.fade)

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if tableView == firstTableView {
        if editingStyle == .delete { 
            if inSearchMode == false {
                codeArray.remove(at: [indexPath.section][indexPath.row])
var dict = codeArray[indexPath.section]
let key = dict.allKeys.first
var codes = dict[key]

//remove code from [Code]
codes.remove(at: indexPath.row)
dict[key] = codes
codeArray[indexPath.section] = dict
                userDefaults.setValue(NSKeyedArchiver.archivedData(withRootObject: codeArray), forKey: "codeArrayKey")
                userDefaults.synchronize()
                self.tableView.reloadRows(at: [IndexPath(row: indexPath.row,       section: indexPath.section)], with: .fade)
            }
        }
    }

让我知道您是否发现实施此问题。