当按下相应视图控制器的 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 带回顶部?的主要内容,如果未能解决你的问题,请参考以下文章
按下按钮时显示 ViewController,同时还存在 tabBar