iOS 11 reloadSections创建重复的标题部分

tableview ios11

1073 观看

2回复

1079 作者的声誉

我正在处理公司的项目,在iOS 11 GM上测试表格视图时遇到了这个问题。它在iOS 10上运行良好。很简单,我有三个带有标题的部分。当我点击节标题时,我的节将折叠/扩展。这是我的方法:

ViewController:

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!

var sectionsOpened: [String: Bool] = [
    "section1": true,
    "section2": true,
    "section3": true
]

func isSectionOpened(section: String) -> Bool {
    return sectionsOpened[section]!
}

@objc func toggleSection1() {
    sectionsOpened["section1"] = !sectionsOpened["section1"]!
    toggle(sectionIndex: 0)
}

@objc func toggleSection2() {
    sectionsOpened["section2"] = !sectionsOpened["section2"]!
    toggle(sectionIndex: 1)
}

@objc func toggleSection3() {
    sectionsOpened["section3"] = !sectionsOpened["section3"]!
    toggle(sectionIndex: 2)
}

func toggle(sectionIndex: Int) {

    self.tableView.reloadSections([sectionIndex], with: .automatic)
    self.tableView.scrollToRow(at: IndexPath(row: 0, section: sectionIndex), at: .top, animated: true)
}

表格视图数据来源:

extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
    return 3
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "testCell", for: indexPath)
    let label = cell.viewWithTag(1) as! UILabel
    label.text = "TEST \(indexPath.section) - \(indexPath.row)"
    return cell
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UILabel(frame: CGRect(x: 0, y: 0, width: 320, height: 60))
    headerView.backgroundColor = UIColor.green
    headerView.text = "Header \(section)"
    var gesture: UITapGestureRecognizer?
    if section == 0 {
        gesture = UITapGestureRecognizer(target: self, action: #selector(toggleSection1))
    } else if section == 1 {
        gesture = UITapGestureRecognizer(target: self, action: #selector(toggleSection2))
    } else if section == 2 {
        gesture = UITapGestureRecognizer(target: self, action: #selector(toggleSection3))
    }
    headerView.addGestureRecognizer(gesture!)
    headerView.isUserInteractionEnabled = true
    return headerView
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 60
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

表视图委托:

extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if !isSectionOpened(section: "section\(indexPath.section+1)") {
        return 1
    }
    if indexPath.section == 0 {
        return 350
    } else if indexPath.section == 1 {
        return 400
    } else if indexPath.section == 2 {
        return 350
    }
    return 500
}

首先要注意的是,scrollToRow的行为很奇怪,它移至顶部,然后向下滚动至该位置。然后,在尝试打开/关闭3个标题后,向上/向下滚动,有时会遇到这个重复的标题问题:

在此处输入图片说明
重新加载节时,标题重复(照片) '

预先感谢您的帮助。我真的需要使它正常工作,因为iOS 11将于下周二发布...

作者: qtngo 的来源 发布者: 2017 年 9 月 15 日

回应 2


3

260 作者的声誉

我遇到了同样的问题,并使用以下方法解决了问题:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
作者: Supala 发布者: 2017 年 9 月 26 日

1

46 作者的声誉

问题与使用自调整大小的单元格时估计的行高有关。似乎,如果我们不提供非常准确的估计,则在重新加载表格视图行时,不同版本的iOS可能会出现一些问题。在iOS 9和10上,表格视图可能会跳到顶部。在iOS 11上,重新加载行时,如果节标题位于顶部,则该节标题似乎重复。

一种解决方案是在显示行时缓存其高,然后在需要时将此高度作为估计的高度提供给表格视图。不得不采取这样的做法很烦人,但它在iOS 9、10和11上为我解决了两个问题。

另请参阅此问题

作者: Darumar 发布者: 2017 年 11 月 21 日
32x32