我正在尝试快速构建一个社交媒体应用程序,该应用程序的标签栏包含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)
答案 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 在所有应用程序中自行完成的方式