如何从uitableview单元格中删除单元格

亚历克斯·陈

当用户选择“类型 3”时,我试图动态排列表格视图。当用户选择“type 3”时它起作用,“type 3-1”将被添加到tableview中。但是,当用户选择 type3-1 以外的选项时,程序崩溃了。我不知道如何在调用覆盖函数之前执行“rows.remove(at:2)”。任何建议将不胜感激!

class GuestViewController: UITableViewController {
var rows:[[[String:Any]]] = [[["type":RowType.DetailContent,
                               "subType":DCType.DCRightContent,
                               "name":CPFFields.CID,
                               "content":"9637"],                                  
                             ["type":RowType.DetailContent,
                              "subType":DCType.DCInput,
                              "name":CPFFields.VISIA]],

                             [["type":RowType.DetailTextView,
                               "CPFType":CPFFields.UV,
                               "title":CPFFields.preferenceTitle]],

                             [["type":RowType.DetailContent,
                               "subType":DCType.DCSelection,
                               "name":CPFFields.Phototherapy,
                               "title":CPFFields.anestheticTitle],
                              ["type":RowType.DetailTextView,
                               "CPFType":CPFFields.Phototherapy,
                               "title":CPFFields.preferenceTitle]],                                 
                             ]
var isNewGuestSelected : Bool = false

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {  

    return rows[section].count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let item = rows[indexPath.section][indexPath.row]     

    let type = item["type"] as! RowType

    if type == RowType.DetailContent
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "DetailNameCell", for: indexPath) as! DetailContentCell

        let cpfType = item["name"] as? CPFFields ?? .Customer
        cell.name.text = CPFFields.localizedString(from: cpfType)
        if let field = item["title"] as? CPFFields
        {
            cell.name.text = CPFFields.localizedString(from: field)
        }
        cell.moreSlectionLeftSpace = true

        var content:String? = ""
        cell.type = cpfType
        switch cpfType {
        case .CID:
            content = (profile?.birthDate.dateFromDateString?.stringForPaitentId ?? "") + (profile?.name ?? "")
        case .CT:
            content = ""
            if let profile = profile
            {
                content = CPFCustomerType.localizedString(from: profile.type)
                //New Guest
                if(content == CPFCustomerType.type1.rawValue){

                    rows[0].insert(["type":RowType.DetailContent,
                                    "subType":DCType.DCRightContent,
                                    "name":CPFFields.CID,
                                    "content":"9637"], at: 1)
                    isNewGuestSelected = true

                } else{
                    if isNewGuestSelected == true{
                        rows[0].remove(at: 1)
                        isNewGuestSelected = false
                    }
                }
            }


let subType = item["subType"] as! DCType
            cell.setcontentType(type: subType, content: content)
            return cell
    }

I expected not to see "rows[0][2]" after running "rows[0].remove(at:1)".
However the log is printing
    rows[0][0]
    rows[0][1]
    rows[0][2]        
    then 
    it crashed at "let item = rows[indexPath.section][indexPath.row]"
    because it is out of range
安特旺面包车保持

您在渲染时正在修改您的内容,因此 afternumberOfRows:inSection:被调用。因此 tableView 试图访问一个不再存在的元素,因为你删除了它。

你的周期:

→ number of rows 4
→ removed item, contents now has 3 items
→ cell for item 0
→ cell for item 1
→ cell for item 2
- cell for item 3 → crash

考虑替换cellForRow方法之外的逻辑,并在重新加载 tableView 之前执行这些操作。

您应该tableView:cellForRow:atIndexPath严格使用来让您的单元格出列并配置它们;不是为了修改底层数据存储,因为像您现在正在经历的时髦事情可能会发生。

如果您提供更多上下文,我可能会告诉您将代码放在哪里以解决此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何删除UITableView中的单元格分隔符?

来自分类Dev

如何重用UITableView中的单元格?

来自分类Dev

从 UITableView Swift 3 中删除所选单元格下方的单元格

来自分类Dev

如何使用删除按钮删除 UITableView 单元格?

来自分类Dev

删除UItableview单元格选择按钮?

来自分类Dev

UITableView 删除单元格重用问题

来自分类Dev

如何在UITableView静态单元格中动态更改单元格高度

来自分类Dev

禁用删除,但在UITableView中启用移动单元格

来自分类Dev

UITableView在搜索时从单元格中删除复选标记

来自分类Dev

删除UITableView中页眉/页脚/单元格之间的分隔

来自分类Dev

如何阻止UITableView重用单元格?

来自分类Dev

如何对UITableView单元格进行分组

来自分类Dev

在UItableView单元格中适合文本

来自分类Dev

在UITableView中编程静态单元格

来自分类Dev

在UITableView单元格中隐藏“>”

来自分类Dev

UITableView中缺少单元格

来自分类Dev

UITableView静态单元格中的IBOutlets

来自分类Dev

在 UITableView 中重用单元格

来自分类Dev

每个 UICollectionView 单元格中的 UITableView

来自分类Dev

UITableView单元格重叠

来自分类Dev

隐藏UITableview单元格

来自分类Dev

UITableView单元格选择

来自分类Dev

如何在UITableView中检测单元格选择-Swift

来自分类Dev

如何在动态UITableView中创建原型单元格?

来自分类Dev

如何指定要在UITableView中显示的单元格?

来自分类Dev

如何删除单个单元格?

来自分类Dev

如何删除datagridview单元格?

来自分类Dev

如何删除UICollectionView单元格

来自分类Dev

如何删除UICollectionView上的单元格