UITableView reloadRows有时会崩溃

时间:2019-08-09 06:19:24

标签: swift uitableview reloadrows

我有4行,显示并隐藏了所选行下方的一些数据。大多数时候,它都能正常工作。但是,当我多次单击第二行/第三行/第四行(如13-14),然后单击第一行时,有时它并不总是崩溃,但是在多次单击后大部分时间都崩溃了。我也在更改行高。仅在多次选择其他行之后选择第一行(情况a)时才会发生崩溃。以下是我的代码-

我尝试了多种操作,例如在beginUpdate和endUpdate之间调用它,在重新加载之前检查indexPath是否存在

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }



 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: ”cell”, for: indexPath) as! CustomTableViewCell

        let model = dataSource[indexPath.row]
        cell.model = model

        switch model.type {
        case .a:
            cell.aList = savedCardList
            cell.addACallback = {[weak self] (sender) in
                self?.moveToAVC()
            }
            cell.addACallback= {[weak self] (a) in
                self?.selectedA = a
                self?.updateButton()
            }

        case .b:
            cell.bList = bList
            cell.bSelectedCallback = {[weak self] (bInfo) in
                self?.selectedB= bInfo
                self?.updateButton()
            }

        case .c:
            cell.cList = cList
            if let cInfo = selectedC {
                cell.selectOtherCButton.setTitle(cInfo.name, for: .normal)
            }
            cell.selectOtherCCallback = {[weak self] (sender) in
                self?.showSelectCVC()
            }
            cell.CSelectedCallback = {[weak self] (cInfo) in
                self?.selectedC = cInfo
                self?.updateButton()
            }

        case .d:
            cell.dTextField.text = dString
            cell.dChangedCallBack = {[weak self] (textField) in
                if let dStr = textField.text {
                    self?.dString = dStr
                }
                self?.updateButton()
            }

        default:
            break
        }
        return cell
    }


 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let model = dataSource[indexPath.row]
        guard model.isSelected == true else {
            return 90
        }
        switch model.type {
        case .a:
            if aList.count > 0 {
                return 350
            }
            return 140

        case .b:
            return 200

        case .c:
            return 270

        case .d:
            return 130

        default:
            return 90
        }
    }


 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let model = dataSource[indexPath.row]
        selectedType = model.type
        updateButtonState(false)
        updateButton()

        if let selectedIndexPath = selectedIndexPath, selectedIndexPath != indexPath {
            self.updatemodelSelectedState(false, at: selectedIndexPath)
            self.updatemodelSelectedState(true, at: indexPath)
            if let _ = tableView.cellForRow(at: indexPath), let _ = tableView.cellForRow(at: selectedIndexPath) {
                self.reloadTableViewRows([selectedIndexPath, indexPath])
                tableView.scrollToRow(at: indexPath, at: .top, animated: true)
            }
        }
        else if !model.isSelected {
            self.updatemodelSelectedState(true, at: indexPath)
                if let _ = tableView.cellForRow(at: indexPath) {
                    self.reloadTableViewRows([indexPath])
                }
        }
        selectedIndexPath = indexPath
    }

 private func reloadTableViewRows(_ indexPaths: [IndexPath]) {
        DispatchQueue.main.async {
            self.myTableView.beginUpdates()
            self.myTableView.reloadRows(at: indexPaths, with: .automatic)
            self.myTableView.endUpdates()
        }
    }

Xcode控制台日志(我只得到这条衬里)-

  

libc ++ abi.dylib:以类型未捕获的异常终止   NSException

此行在self.myTableView.endUpdates()处崩溃。如果删除开始和结束更新,则它会崩溃在self.myTableView.reloadRows(位于:indexPaths,带有:.automatic)上。同样,对于其中的一行,单击按钮后会显示一个弹出窗口,然后如果选择第一行,它将崩溃!

我还在隐藏和显示的表格视图行中有集合视图。即使将其流设置为水平,在偶尔单击几次之后,我也注意到集合视图行以垂直流进入,然后在单击时再次回到水平流。不知道为什么会这样,但这可能是问题吗?

请帮助。我正在尝试从最近的2-3个小时解决此问题:(

1 个答案:

答案 0 :(得分:-1)

尝试一下,我希望它对您有用:

   UIView.setAnimationsEnabled(false)
   tableView.beginUpdates()
   tableView.reloadRows(at: [indexPath!], with: .none)
   tableView.endUpdates()
   UIView.setAnimationsEnabled(true)