Быстрая прокрутка вверх не работает после дополнительной загрузки

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

У меня есть tableview, который загружает больше. Я хотел бы добавить функцию прокрутки вверх, когда пользователь дважды нажимает элемент панели вкладок, например Twitter, Instagram.

Это мой код, когда пользователь дважды нажимает на элемент панели вкладок.

     func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
      if previousController == viewController {
        if let navVC = viewController as? UINavigationController, let vc = navVC.viewControllers.first as? AssistantMainViewController {
            if vc.isViewLoaded amp;amp; (vc.view.window != nil) {
                // viewController is visible
                vc.tableView.setContentOffset(CGPoint(x: 0, y: -173), animated: true)
            }
        }
    }
    previousController = viewController
}
  

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

В основном действии «Загрузить больше» приложение получает больше контента с сервера и добавляет их в массив и вызывает tableview.reloadData()

 adviceDataSource.loadMoreContent(beforeDay: beforeDate, success: {feedCount in
        if feedCount == 0 {
            self.didGetLastPage = true
        }
        self.tableView.reloadData()
        self.tableView.layoutSubviews()
        self.isRunningRequest = false
    }, error: { (errorString, statusCode) in
        self.isRunningRequest = false

    }) { (MoyaError) in
        self.isRunningRequest = false
    }
  

Вероятно, проблема в том, что когда я загружаю больше ячеек, tableview не знает свой новый размер содержимого.Кстати, при нажатии на строку состояния tableview отлично прокручивается до верха. Если вы знаете функцию, которая вызывается, когда пользователь нажимает строку состояния, это было бы идеально для меня.

Я работал и искал над этим 2 дня, есть какая-нибудь помощь?

Спасибо!

Комментарии:

1. Вы пробовали использовать tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) ?

2. Я пробовал, но мои ячейки tableview не начинаются с верхней части экрана, поэтому мне нужно выполнить смещение содержимого, но если решения нет, мне приходится использовать scrollToRow. Спасибо!

3. Вы пробовали scrollRectToVisible(_:animated:) ?

4. Это тоже не работает @OmarChaabouni

Ответ №1:

вызовите UITabBarControllerDelegate в вашем классе viewcontroller TableView.

в методе viewdidload вызовите self.TabBarController?.delegate = self

реализуйте didselect панели вкладок в вашем классе viewcontroller

 func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    let tabBarIndex = tabBarController.selectedIndex
    if tabBarIndex == 0 {
        self.tableView.setContentOffset(CGPoint.zero, animated: true)
    }
}
  

Ответ №2:

Замените TableView.layoutSubviews() на TableView.layoutIfNeeded(), он сразу же верстает tableview.

И используйте tabbarcontrollerdelegate: viewcontroller (которому принадлежит tableview) будет прослушивать его. и используйте этот метод

self.primaryTableView.scrollToRow(в: indexPath, в: UITableViewScrollPosition, анимированный: Bool)