当按下相应视图控制器的tabBar图标时,如何将collectionView返回顶部?

时间:2019-06-15 03:52:39

标签: ios swift uitabbarcontroller xcode10

我正在尝试快速构建一个社交媒体应用程序,该应用程序的标签栏包含4个图标,每个图标均连接到视图控制器。我想让四个集合视图(每个视图都与一个视图控制器相关联)在按下相应的标签栏图标(就像推特一样)时滚动回到顶部。

只有当过去的标签栏图标用于相应的集合视图时,我才具有使集合视图返回顶部的逻辑(这样做是为了避免单击时它会自动滚动到顶部)在相应的选项卡上,但需要再次按下)我尝试调试我的第一个开关盒,但是没有运气,所以我还没有其他情况的完整代码。我要做的是先引用正确的情节提要,然后引用正确的视图控制器(在本例中为homeViewController),最后调用相应的集合视图并使用setContentOffset将其置于顶部。

下面我将提供整个tabBarController类。

import Foundation
import UIKit

class MainTabController: UITabBarController, UITabBarControllerDelegate {

    var pastTabBar: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        self.delegate = self


    }


    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

            let tabBarIndex = tabBar.items?.index(of: item)

            if tabBarIndex == pastTabBar {

                switch tabBarIndex {

                case 0:
                    print ("go to top of home")
                    //updateHomeCollection = 1
                    let HomeSB : UIStoryboard = UIStoryboard(name: "Home", bundle: nil)
                    let HomeVC = HomeSB.instantiateViewController(withIdentifier: "Home") as? HomeViewController
                    HomeVC?.collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
                case 1:
                    print ("go to top of search")
                case 2:
                    print ("go to top of notifications")

                case 3:
                    print ("go to top of profile")

                default:
                    print ("not working")
                }
            }

        if let tabBarIndex = tabBarIndex {
            pastTabBar = tabBarIndex
        }

        }

}

单击主页选项卡时,它会保持信号中止!它正在打印此确切的声明:

  

线程1:致命错误:意外地发现nil而隐式   展开可选值

在此代码行上:

HomeVC?.collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)

1 个答案:

答案 0 :(得分:0)

加载ViewController并不是最好的方法。您必须像下面这样从ViewController获取所需的Navigation

extension HomeTabVC: UITabBarControllerDelegate {

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if previousController == viewController {
            if let nav = viewController as? UINavigationController, let vc = nav.viewControllers[0] as? FeaturedVC {
                if vc.isViewLoaded && (vc.view.window != nil) {
                    let visibleIndex = vc.collectionFeatured.indexPathsForVisibleItems
                    if visibleIndex.count != 0 {
                        vc.collectionFeatured.scrollToItem(at: IndexPath (item: 0, section: 0), at: .bottom, animated: true)
                    }
                }
            }else if let nav = viewController as? UINavigationController, let vc = nav.viewControllers[0] as? CategoryVC {
                if vc.isViewLoaded && (vc.view.window != nil) {
                    let visibleIndex = vc.collectionViewCategory.indexPathsForVisibleItems
                    if visibleIndex.count != 0 {
                        vc.collectionViewCategory.scrollToItem(at: IndexPath (item: 0, section: 0), at: .bottom, animated: true)
                    }
                }
            }else{

            }
        }

        previousController = viewController

    }
}

您必须将选定的ViewController存储在变量中,因此当您将ViewController从一个选项卡更改为另一个选项卡时,它只会更改ViewController,而当您再次点击同一选项卡时,它将向后滚动到达顶点。这是 iOS 在所有应用程序中自行完成的方式