Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift ios 9: Section header change position after reload data

I have plain UITableView with many sections and rows. Sections work fine. But sometimes after reload data of table, section change position. For example it was happened when i change tabs. What could be the problem?

Image before changed tabs:

Before change tab

Image after changed tabs:

After change tab

Update: Add code below:

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))
    }

}
like image 863
Eduard Kornev Avatar asked May 13 '16 09:05

Eduard Kornev


3 Answers

I know it's an old thread but uncheck the Adjust Scroll View Insets doesn't help. I had this problem and solved it by reload table twice.

like image 105
Hebbian Avatar answered Nov 16 '22 00:11

Hebbian


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

This help me out.

Double reloadData will cause flickering while this solution won't.

like image 43
user3480295 Avatar answered Nov 16 '22 00:11

user3480295


Calling reloadData() twice also works for me, but I would suggest calling tableView.layoutSubviews() after reloadData(), which also works for me.

like image 3
Haoxin Li Avatar answered Nov 16 '22 01:11

Haoxin Li