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

Posted

技术标签:

【中文标题】当按下相应视图控制器的 tabBar 图标时,如何将 collectionView 带回顶部?【英文标题】:How can I bring a collectionView back to the top when the tabBar icon for that respective view controller is pressed? 【发布时间】:2019-06-15 03:52:39 【问题描述】:

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

只有当过去的标签栏图标用于相应的集合视图时,我才希望集合视图返回顶部的逻辑(这样它不会在单击时自动滚动到顶部在相应的选项卡上,但需要再次按下)我尝试调试我的第一个 switch 案例但没有运气,所以我还没有其他案例的完整代码。我尝试做的是引用正确的故事板,然后是正确的视图控制器(在本例中为 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)

【问题讨论】:

HomeSB.instantiateViewController(withIdentifier: "Home") as? HomeViewController 你每次都在实例化新的HomeViewController。希望这有助于UITabBar Programatically 我尝试理解您提供的资源,但我认为这离我的问题太远了。我继续并取出实例化行并放入 HomeViewController() 而不是 HomeVC 但仍然得到相同的错误 我应该提到这一点,但我所有的视图控制器和标签栏控制器都是用故事板完成的。 @prex 【参考方案1】:

加载ViewController 不是最好的方法。您必须从Navigation 获取您想要的ViewController,如下所示

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 在所有应用程序中的自我实现方式

【讨论】:

抱歉,您是在告诉我应该将整个扩展名粘贴到我的 tabController 文件中吗? @PinkeshGjr 不,您必须更改代码。你必须添加你的 viewControllers 好的,谢谢,CategoryVC 变量代表什么? @PinkeshGjr 视图控制器。它应该是您要滚动的 ViewController。 我不断收到错误消息:FeaturedVC 和 CategoryVC 的“使用未声明的类型”,即使我将其设置为我的 homeVC。我该怎么办? @PinkeshGjr

以上是关于当按下相应视图控制器的 tabBar 图标时,如何将 collectionView 带回顶部?的主要内容,如果未能解决你的问题,请参考以下文章

当按下按钮或视图迅速消失时

Mat-icon:当按下一个按钮时,所有的图标都会改变

按下按钮时显示 ViewController,同时还存在 tabBar

如何在不隐藏 tabBar 的情况下呈现视图控制器

TabBar /“更多视图控制器” - 可能有黑色以外颜色的图标?

使用视图控制器的 TabBar 按钮在框架中添加滑动子视图