微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从一个部分删除一行并同时将其添加到另一部分?

如何解决如何从一个部分删除一行并同时将其添加到另一部分?

我在 tableview 中有两个部分。顶部部分代表公共数据,在滑动时可以将其设为私有,然后将从第 1 部分中删除显示在私有部分(第 2 部分)中。类似地,当第 2 部分(私有部分)中的一个单元格被点击时,需要将其添加公共部分 1。我遇到了很多问题,所以我交替使用先删除该单元格,然后添加单元格(反之亦然),或删除添加数据然后更新表格视图。在此先感谢所有帮助,我已经搜索堆栈溢出大约一个星期了,大约 6 到 10 年前的所有类似帖子都没有帮助。

-我猜这是 numberOfRowsInSection 方法的问题。我已经玩过这个了,我当前的版本在下面。 - 添加删除单元格方法也存在问题。 代码如下

func numberOfSections(in tableView: UITableView) -> Int {
        return numberOfSections
    }
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        var rowCount = 0
        //return multidimsensional[section].count == 0 ? 1 : multidimsensional[section].count
        
        switch section {
            case 0:
                rowCount = eisForMe.count == 0 ? 1 : eisForMe.count
            case 1:
                rowCount = hiddenEIs.count == 0 ? 0 : hiddenEIs.count
                
            default: break
        }
        return rowCount
    }
    
    func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 140
    }
    func tableView(_ tableView: UITableView,editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        if indexPath.section == 1 {
            return .insert
        }
        return .delete
    }
    
    func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) {
        if editingStyle == .insert {
            let hiddenObject = hiddenEIs[indexPath.row]
            setPublicAgainDB(indexPath: indexPath)

            let ct = self.eisForMe.count
            
//problem with this removing then deleting
            hiddenEIs.remove(at: indexPath.row)
            tableView.beginUpdates()
            tableView.deleteRows(at: [indexPath],with: .automatic)
            tableView.endUpdates()
            
            eisForMe.append(hiddenObject)            
            tableView.beginUpdates()
            tableView.insertRows(at: [IndexPath(row:ct,section:0)],with:.fade)
            tableView.endUpdates()
            
            checkNewEIArray()
                    
            print("add")
        }
        
        if editingStyle == .delete {
            print("delete!")
        }
    }
    
    func tableView(_ tableView: UITableView,trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        
            //remove section
            let deleteAction = self.contextualDeleteAction(forRowAtIndexPath: indexPath)
            let swipeConfig = UISwipeActionsConfiguration(actions: [deleteAction])
            return swipeConfig
    }
    
    func contextualDeleteAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {
            let action = UIContextualAction(style: .normal,title: "Hide") { [self] (contextAction: UIContextualAction,sourceView: UIView,completionHandler: (Bool) -> Void) in
                let futureCount = eisForMe.count - 1
                if futureCount == 0 {
                    print("count 0,don't remove")
                    let banner = NotificationBanner(title: "Wait!",subtitle: "You need at least one public EI",leftView: nil,rightView: nil,style: .info)
                    banner.show()
                    delay(2.5,closure: {
                        banner.dismiss()
                    })
                } else {
                
                    let hiddenObject = self.eisForMe[indexPath.row]
                    setHiddenDB(indexPath: indexPath)
                    
                    
                    hiddenEIs.append(hiddenObject)
                    let ct = self.hiddenEIs.count
                    tableView.beginUpdates()
                    tableView.insertRows(at: [IndexPath(row:ct,section:1)],with:.automatic)
                    tableView.endUpdates()

                    eisForMe.remove(at: indexPath.row)
                    tableView.beginUpdates()
                    tableView.deleteRows(at: [indexPath],with: .automatic)
                    tableView.endUpdates()
                    
                    checkNewEIArray()
                    
                    completionHandler(true)
                }
            }
            // 7
            action.image = UIImage(systemName: "eye.slash")
            action.backgroundColor = Colorify.Marina
            return action
        }

您会注意到在 numberOfRowsInSection 中 eisForMe.count 可以是 1(无论是 1 还是 0 都会导致一些错误)但不是 hiddenEis,因为在填充之前它总是从 0 开始.变量 numberofsection 由以下方法确定:

@objc func editShownEIs () {
        if !isTbvEditing { //not editing
            addTBVSection()
            tableView.isEditing = true
            isTbvEditing = true
        } else {
            removeTBVSection()
            rearrageEIS.pulse(alpha: 0.5)
            tableView.isEditing = false
            isTbvEditing = false
            
        }
    }
    
    func addTBVSection() {
        numberOfSections += 1
        let indexSt = IndexSet(integer: numberOfSections - 1)
        tableView.performBatchUpdates({
            tableView.insertSections(indexSt,with: .top)
        },completion: { (update) in
            print("section added")
        })
    }
    
    func removeTBVSection() {
        numberOfSections -= 1
        let indexSt = IndexSet(integer: numberOfSections - 1)
        tableView.performBatchUpdates({
            tableView.deleteSections(indexSt,with: .bottom)
        },completion: { (update) in
            print("section removed")
        })
    }

无论如何,我的基本想法是,例如,当点击第 0 部分中的一个单元格时:该单元格 a) 从 0 中移除并且 b) 同时插入到第 1 部分中(或者,一个一个地插入)。同样,当第 1 节中的单元格被点击以插入第 0 节时,需要将其从第 1 节中删除添加到第 0 节。 在此先感谢所有帮助,我已经搜索堆栈溢出大约一个星期了,大约 6 年前的所有类似帖子都没有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。