【问题标题】:Swift scroll to top not working after load more加载更多后快速滚动到顶部不起作用
【发布时间】:2019-03-21 08:59:32
【问题描述】:

我有一个加载更多的表格视图。当用户按两次标签栏项目(如 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 && (vc.view.window != nil) {
                // viewController is visible
                vc.tableView.setContentOffset(CGPoint(x: 0, y: -173), animated: true)
            }
        }
    }
    previousController = viewController
}

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 天,有什么帮助吗?

谢谢!

【问题讨论】:

  • 您是否尝试过使用tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
  • 我已经尝试过了,但我的 tableview 单元格没有从屏幕顶部开始,所以我需要处理内容偏移,但如果没有解决方案,我必须使用 scrollToRow。谢谢!
  • 你试过scrollRectToVisible(_:animated:)吗?
  • 它也不能正常工作@OmarChaabouni

标签: ios swift uitableview


【解决方案1】:

在您的 viewcontroller tableView 类中调用 UITabBarControllerDelegate。

在 viewdidload 方法调用 self.tabBarController?.delegate = self

在您的视图控制器类中实现选项卡栏确实选择

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

【讨论】:

    【解决方案2】:

    用tableView.layoutIfNeeded()替换tableView.layoutSubviews(),它会立即布局tableview。

    并使用 tabbarcontrollerdelegate: viewcontroller(拥有 tableview)会监听它。并使用此方法

    self.primaryTableView.scrollToRow(at: IndexPath, at: UITableViewScrollPosition, animated: Bool)

    【讨论】:

      猜你喜欢
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多