ios – 添加单元格后TableView Auto Scrolling行为不正常

前端之家收集整理的这篇文章主要介绍了ios – 添加单元格后TableView Auto Scrolling行为不正常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
查看设置:

我的TableView有3个部分,每个部分有4或9个单元格.每个Cell都有一个Label和TextField.
在开始编辑每个部分的索引2处的单元格时,我重新加载现在将包含9个单元格的部分(将模型更新为dequeueCell,以便再添加5个单元格).

问题:

tableView按预期滚动(将文本字段显示到屏幕的可见部分)以用于该部分的未展开状态.但是在我通过开始编辑任何部分的索引2处的单元格的文本字段来添加单元格之后,tableView会滚动以隐藏文本字段.一旦任何部分扩展了单元格数量,就会对tableview中的任何单元格进行奇怪的滚动.此外,虽然发生了奇怪的滚动,但是重新加载了tableView(这导致焦点远离文本字段).我在单元格的didBeginEditing(:_)自定义委托中包含了tableView.reloadSection(_ :).
我在iOS 9和10中看到过这个问题

对不起解释不好.谢谢

继承人Github Repo

问题在这里

附:我正在使用Swift 3和Xcode 8.3.3以及部署目标iOS 10

请不要在Swift 4和Xcode 9中建议回答

解决方法

您可以尝试另一种方法:更改单元格的高度而不是插入/删除.

更改单元格数以始终返回所有项目:

override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation,return the number of rows
        guard let sectionEnum = Sections(rawValue: section) else { return 0 }

        return sectionEnum.getRows(forExpanded: true).count
    }

将“隐藏”项的高度设置为0:

override func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
    guard let sectionEnum = Sections(rawValue: indexPath.section) else { return 0 }

    let isExpanded = expandedSectionData[indexPath.section]
    if (!isExpanded) {
        let object = sectionEnum.getRows(forExpanded: true)[indexPath.row]
        if (!sectionEnum.getRows(forExpanded: false).contains(object)) {
            return 0;
        }
    }
    return self.tableView.estimatedRowHeight
}

设置单元格以将子视图剪辑到其边界:

override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
           ....
           cell.clipsToBounds = true;
           return cell
        }

并将更新代码更改为(删除tableView.reloadSections,更改indexPath):

func didBeginEditing(textField: UITextField,cell: UITableViewCell) {
        guard let indexPath = tableView.indexPath(for: cell),let section = Sections(rawValue: indexPath.section) else { return }
        if indexPath.row == 7 && !expandedSectionData[indexPath.section] {
            expandedSectionData[indexPath.section] = true
            tableView.beginUpdates()
            tableView.endUpdates()
            tableView.scrollToRow(at: indexPath,at: UITableViewScrollPosition.none,animated: true)
            textField.becomeFirstResponder()
        }

}

猜你在找的iOS相关文章