Swift ios 9:重新加载数据后的章节标题更改位置

时间:2016-05-13 09:51:53

标签: swift uitableview ios9

我有简单的UITableView,包含许多部分和行。部分工作正常。但有时在重新加载表格数据后,部分会改变位置。例如,当我更改标签时发生了这种情况。可能是什么问题?

更改标签之前的图片:

Before change tab

更改标签后的图片:

After change tab

更新 添加以下代码:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    self.dishesListTableView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


func customizeCollectionView() {
    self.collectionView.delegate = self
    self.collectionView.dataSource = self
    self.collectionView.dataProviderDelegate = self.dishesListDataProvider
    self.collectionView.showsHorizontalScrollIndicator = false
    self.collectionView.decelerationRate = UIScrollViewDecelerationRateFast
    self.collectionView.registerClass(HPCollectionViewCell.self, forCellWithReuseIdentifier: HPCollectionViewCellConstants.reuseIdentifier)
}

//MARK: - UITableViewDelegate
func customziseDishesListTableView(){
    self.dishesListTableView.delegate = self
    self.dishesListTableView.dataSource = self

    self.dishesListTableView.registerNib(UINib(nibName: DishesListSingleTableViewCell.nibName, bundle: nil), forCellReuseIdentifier: DishesListSingleTableViewCell.nibName)
    self.dishesListTableView.registerNib(UINib(nibName: DishesListSinglePizzaTableViewCell.nibName, bundle: nil), forCellReuseIdentifier: DishesListSinglePizzaTableViewCell.nibName)

    self.dishesListTableView.estimatedRowHeight = 123
    self.dishesListTableView.rowHeight = UITableViewAutomaticDimension

    if self.dishesListDataProvider.isPizza() {
        self.dishesListTableView.separatorColor = UIColor.clearColor()
    }else{
        self.dishesListTableView.separatorColor = UIColor.expSilverColor()
    }
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.dishesListDataProvider.countOfDishes(section)
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return self.dishesListDataProvider.countOfKitchenTypes()
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if self.dishesListDataProvider.getDishItemByIndex(indexPath.section, indexDish: indexPath.row).isPizza() {
        let cell = tableView.dequeueReusableCellWithIdentifier(DishesListSinglePizzaTableViewCell.nibName, forIndexPath: indexPath) as! DishesListSinglePizzaTableViewCell
        cell.customizeView(self.dishesListDataProvider.getDishItemByIndex(indexPath.section, indexDish: indexPath.row), dishesListSingleTableViewCellProtocol: self, indexPath: indexPath)
        return cell
    }else{
        let cell = tableView.dequeueReusableCellWithIdentifier(DishesListSingleTableViewCell.nibName, forIndexPath: indexPath) as! DishesListSingleTableViewCell

        cell.customizeView(self.dishesListDataProvider.getDishItemByIndex(indexPath.section, indexDish: indexPath.row), dishesListSingleTableViewCellProtocol: self, indexPath: indexPath)
        return cell
    }
}

func tableView(tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {
    self.collectionView.scrollToIndex(section, animated: true)
    self.collectionView.changeSelectionForCellAtIndexPath(NSIndexPath(forItem: section, inSection: 0))
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionView = NSBundle.mainBundle().loadNibNamed(DishesListSectionView.nibName, owner: self, options: nil)[0] as! DishesListSectionView

    sectionView.customizeView(self.dishesListDataProvider.getKitchenItemByIndex(section).kitchenTypeTitle)

    return sectionView
}
//MARK: - UIScrollViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
    if currentSectionIndex != self.dishesListTableView.indexPathsForVisibleRows![0].section {
        currentSectionIndex = self.dishesListTableView.indexPathsForVisibleRows![0].section
        self.collectionView.scrollToIndex(currentSectionIndex, animated: true)
        self.collectionView.changeSelectionForCellAtIndexPath(NSIndexPath(forItem: currentSectionIndex, inSection: 0))
    }

}

7 个答案:

答案 0 :(得分:20)

tableView.reloadData()
tableView.layoutIfNeeded()
tableView.beginUpdates()
tableView.endUpdates()

这帮助了我。

Double reloadData会导致闪烁,而此解决方案不会出现问题。

答案 1 :(得分:6)

我知道这是一个旧线程,但取消选中Adjust Scroll View Insets无效。我遇到了这个问题,并通过重新加载表两次来解决它。

答案 2 :(得分:3)

调用reloadData()两次也适合我,但我建议在reloadData()之后调用tableView.layoutSubviews(),这也适用于我。

答案 3 :(得分:1)

看起来您的表格视图单元格的估计高度问题。由于内部优化系统根据估计的高度值计算缺席单元格的高度,这就是为什么它可以将您的标题定位在错误的计算高度上(如真实单元格大于或小于其估计的大小)。当您在列表中间调用reloadData()时,通常会发生这种情况。作为一个正确的解决方案,您应该避免在想要使用第二页更新列表内容时调用reloadData()。所以你应该使用tableView.beginUpdates()tableView.endUpdates()并更新表视图的项集合。还有一个新的基于闭包的API performBatchUpdates(就像UICollectionView一样),但它可以从iOS 11获得。

希望为您找到合适的解决方案可能会有所帮助

答案 4 :(得分:0)

这是因为UI viewcontroller属性。请先从故事板,属性检查器

中选择UIViewController

enter image description here

答案 5 :(得分:0)

在我的项目中,当我提起tableView请求更多数据然后在请求后重新加载数据时发生此错误。我需要在请求数据后创建许多部分,如果i reloadData两次,它可能会影响性能。不仅如此,我发现如果我向上或向下滚动tableView,部分的headerView的位置就会正确。所以我修复了这个错误(我的情况)我通过这个请求数据:

[_tableView reloadData];
CGPoint offSetOrigin     = _tableView.contentOffset;
CGPoint offSetSecond     = CGPointMake(0, offSet.y-1);
_tableView.contentOffset = offSetSecond;
_tableView.contentOffset = offSet;

答案 6 :(得分:0)

这里的解决方案并没有解决我的问题,所以我要留下一个可能帮助我的解决方案。

设置estimatedSectionHeaderHeight,似乎我的tableView无法计算没有它的第一部分的初始位置。