Изображение после измененных вкладок:

Изображение до измененных вкладок:

Before change tab

Я ответил на вопрос аналогичного типа на странице Angular 2 И Ionic для Интернета и мобильных приложений

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

}
11
Eduard Kornev 13 Май 2016 в 12:51

7 ответов

Лучший ответ

У меня простой UITableView с множеством разделов и строк. Разделы работают нормально. Но иногда после перезагрузки данных таблицы положение раздела меняется. Например, когда я менял вкладки. В чем может быть проблема?

7
Hebbian 9 Июн 2016 в 05:52
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.beginUpdates()
tableView.endUpdates()

Я знаю, что это старая ветка, но снятие флажка {{X0}} не помогает. У меня была эта проблема, и я решил ее дважды перезагрузить таблицу.

Двойной reloadData вызовет мерцание, а это решение - нет.

20
user3480295 9 Окт 2016 в 10:03

Двойной вызов reloadData () также работает для меня, но я бы предложил вызвать tableView.layoutSubviews () после reloadData (), который также работает для меня.

3
Haoxin Li 5 Май 2017 в 23:16

Похоже, проблема в расчетной высоте ячеек табличного представления. Благодаря внутренней оптимизации система вычисляет высоту отсутствующих ячеек на основе оценочного значения высоты, поэтому она может позиционировать ваши заголовки на неверно рассчитанной высоте (например, реальные ячейки больше или меньше их расчетного размера). Обычно это происходит, когда вы вызываете reloadData() в середине списка. В качестве правильного решения вам следует избегать вызова reloadData(), когда вы хотите обновить содержимое списка, например, второй страницей. Поэтому вам следует использовать tableView.beginUpdates() и tableView.endUpdates() и обновить коллекцию элементов для табличного просмотра. Также есть новый API на основе замыкания performBatchUpdates (как и для UICollectionView), но он доступен в iOS 11.

Это выручит меня.

1
alokard 7 Ноя 2017 в 16:03

Надеюсь, это поможет найти для вас правильное решение

enter image description here

0
Sucharu Hasija 13 Май 2016 в 09:57

В моем проекте эта ошибка произошла, когда я подтянул tableView, чтобы запросить дополнительные данные, а затем перезагрузить данные после запроса. Мне нужно создать много разделов после запроса данных, и это может повлиять на производительность, если я reloadData дважды. Более того, я обнаружил, что если я прокручиваю вверх или вниз tableView, положение заголовка раздела становится правильным. Итак, я исправляю эту ошибку (мое состояние), я запрашиваю данные следующим образом:

[_tableView reloadData];
CGPoint offSetOrigin     = _tableView.contentOffset;
CGPoint offSetSecond     = CGPointMake(0, offSet.y-1);
_tableView.contentOffset = offSetSecond;
_tableView.contentOffset = offSet;
0
guozqzzu 4 Янв 2017 в 04:09

Приведенные здесь решения не устранили мою проблему, поэтому я оставляю еще одно возможное решение, которое мне помогло.

Это из-за свойства UI viewcontroller. Сначала выберите UIViewController из раскадровки, инспектора атрибутов

0
Leonardo 25 Янв 2017 в 11:18