【问题标题】:Scroll to top UITableView with double tap on UITabBarItem双击 UITabBarItem 滚动到顶部 UITableView
【发布时间】:2016-09-04 13:56:09
【问题描述】:

我想在他们的列表中模拟 twitter 或 instagram 的行为:

在 UITabBarItem 中双击时,列表滚动到顶部。有人知道我该怎么做? 我的 UITabBarController 中有 4 个项目,它们都是列表,所以我想为所有人做这件事。

问题是当我在 mi 列表的推送视图中点击 bar 项目时,此函数调用并在获取导航的根视图控制器之前检测双击。

我希望能清楚我的问题。

var previousController: UIViewController?

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    if previousController == viewController{
        if let navVC = viewController as? UINavigationController, vc = navVC.viewControllers.first as? HomeViewController {
            vc.tableBusinessList.setContentOffset(CGPointZero, animated: true)
            print("same")
        }
    }else{
        print("No same")
    }
    previousController = viewController
}

行为不正确。 当我使用标签栏项目弹出视图时,根视图位于单元格 0

【问题讨论】:

  • @OlivierWilkinson 我添加了一个 gif 来展示我的实际行为

标签: ios swift uitableview uitabbarcontroller uitabbaritem


【解决方案1】:

好的,所以我认为最好的方法是检查带有 tableView 的 viewController 是否可见,如果不可见,则不要调用 set content offset。

所以:

var previousController: UIViewController?

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    if previousController == viewController {
        if let navVC = viewController as? UINavigationController, vc = navVC.viewControllers.first as? HomeViewController {

            if vc.isViewLoaded() && (vc.view.window != nil) {
                // viewController is visible
                vc.tableBusinessList.setContentOffset(CGPointZero, animated: true)
            }

            print("same")
        }
    }else{
        print("No same")
    }

    previousController = viewController

}

【讨论】:

  • 嘿!感谢您的回答,它的工作原理!仅对第三个 if 语句 'if vc.isViewLoaded() && (vc.view.window != nil)' 进行了一些更改,就是这样!。非常感谢您的帮助。
  • 完全没问题!我很高兴能帮上忙:)
  • 我将编辑我的答案以使其正确,为抬头欢呼!
  • 完美解决方案。非常感谢@OlivierWilkinson
  • 不会一次滚动到完全顶部。在 ipad 中。
【解决方案2】:

斯威夫特 3

extension UIViewController {
    func scrollToTop() {
        func scrollToTop(view: UIView?) {
            guard let view = view else { return }

            switch view {
            case let scrollView as UIScrollView:
                if scrollView.scrollsToTop == true {
                    scrollView.setContentOffset(CGPoint(x: 0.0, y: -scrollView.contentInset.top), animated: true)
                    return
                }
            default:
                break
            }

            for subView in view.subviews {
                scrollToTop(view: subView)
            }
        }

        scrollToTop(view: self.view)
    }
}

如何使用

var previousController: UIViewController?

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

        //when user is in FeedViewController and scroll at last record and want to
        if previousController == viewController {
            if let navVC = viewController as? UINavigationController, let vc = navVC.viewControllers.first as? HomeViewController {

                if vc.isViewLoaded && (vc.view.window != nil) {
                    vc.scrollToTop()
                }
                print("same")
            }
        }
        else{
            print("No same")
        }

        previousController = viewController
        return true;
    }

注意:我使用@Olivier Wilkinson 并展示了如何在需要的地方使用扩展来滚动到顶部。 (针对集合视图测试)

【讨论】:

  • 就像一个魅力。但是我有一个错误。我有 3 个栏项目,每当我单击最后一个栏项目时,它会以某种方式弄乱我的“UITabBarControllerDelegate”,因为当我回到第一个栏项目“func tabBarController”不再触发......任何想法?感激不尽
  • 这个方法在你点击tab bar 2次时调用,当你将tab从3rd改为1st需要点击2次时,试试这样。
  • 我知道。它与第一个和第二个选项卡项目完美配合。顺便说一句,这是在第一个标签栏中实现的。但是,如果我导航到 3rd,它会以某种方式搞乱我的代表,我不知道,因为它不会再工作了
  • 你需要在你的主UITabBarController中编写这个方法,上面的方法是它的委托方法,所以当用户改变标签栏时它会自动调用。
  • 对我不起作用。 swift 4. 我在 Tabbarcontroller 类中实现了它。当我点击栏项目时没有任何反应
【解决方案3】:

Olivier Wilkinsons 的回答很好,但是向上滚动部分在 Swift 4 中不再起作用,所以替换

vc.tableBusinessList.setContentOffset(CGPointZero, animated: true)

vc.tableBusinessList.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)

一切准备就绪

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2018-11-02
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多