我有以下代码,我试图实现"滚动到顶部"在UIViewcontroller上,"滚动到开头"在另一个UIViewController上。
第一个VC有一个表视图,第二个VC有一个集合视图。
-NearMeViewController-
override func viewDidLoad() {
super.viewDidLoad()
self.tabBarController?.delegate = self
//....
}
extension NearMeViewController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let tabBarIndex = tabBarController.selectedIndex
if tabBarIndex == 0 {
self.nearMeTable.setContentOffset(CGPoint.zero, animated: true)
}
}
}
-MapSearchViewController-
override func viewDidLoad() {
super.viewDidLoad()
self.tabBarController?.delegate = self
//....
}
extension MapSearchViewController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let tabBarIndex = tabBarController.selectedIndex
if tabBarIndex == 2 && requests.mapEventData.count > 0 {
self.resultsCollectionView?.scrollToItem(at: IndexPath(row: 0, section: 0),
at: .left,
animated: true)
}
}
}
当然,它们都连接到同一个UITabBar。 问题是当我打开应用程序时,我按下tabBarIndex 0它会滚动到表格视图的顶部。
然后我改变VC,我尝试按tabBarIndex 2,所以它转到了集合视图的第一项。
之后我回到第一个VC,当我尝试按tabBarIndex 0时,tableview没有滚动到顶部(就像我第一次打开应用程序时那样)。
但是第二个带有集合视图的VC工作正常。
知道为什么会这样吗?
答案 0 :(得分:2)
每次VC出现时都没有调用viewDidLoad,但只有一次(或者之前被解除分配)
vc 0的委托只设置一次...然后加载vc1并设置为委托......但不再是vc0。
要使其工作,请在viewWillAppear中设置委托。
一遍又一遍地改变代表这很奇怪......并且检查索引最好是与DonMag的解决方案一起使用。
答案 1 :(得分:1)
看起来您正在检查tabBarController的.selectedIndex
...但这是当前显示标签的索引,而不是您所在的标签"在前往。"
更有可能的是,您希望使用与此类似的代码:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if let vc = viewController as? MapSearchViewController {
// user tapped Map Search tab item
}
if let vc = viewController as? NearMeViewController {
// user tapped Near Me tab item
}
}
编辑:这是一个简单的例子,使用了一个subClassed UITabBarController。
正常设置故事板,创建视图控制器并将它们连接为" Tabs",然后将TabBarController的自定义类设置为MyTabBarController
。这个示例代码(希望)很容易理解。
可运行的示例位于:https://github.com/DonMag/SWTabBarSubclass
//
// TabBarSample.swift
//
import UIKit
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// all your normal setup stuff....
}
func firstViewSpecific(_ aValue: Int) -> Void {
print("Passed value is:", aValue)
// do something with the passed value
}
}
class NearMeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// all your normal setup stuff....
}
func resetMe() -> Void {
print("resetMe() called in NearMeVC")
// do whatever you want, such as
self.nearMeTable.setContentOffset(CGPoint.zero, animated: true)
}
}
class MapSearchViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// all your normal setup stuff....
}
func resetMe() -> Void {
print("resetMe() called in MapSearchVC")
// do whatever you want, such as
if requests.mapEventData.count > 0 {
self.resultsCollectionView?.scrollToItem(at: IndexPath(row: 0, section: 0),
at: .left,
animated: true)
}
}
}
class MyTabBarController: UITabBarController, UITabBarControllerDelegate {
var myValue = 0
override func viewDidLoad() {
super.viewDidLoad()
// make self the UITabBarControllerDelegate
self.delegate = self
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if let vc = viewController as? FirstViewController {
myValue += 1
vc.firstViewSpecific(myValue)
return
}
if let vc = viewController as? NearMeViewController {
vc.resetMe()
return
}
if let vc = viewController as? MapSearchViewController {
vc.resetMe()
return
}
}
}
答案 2 :(得分:0)
可能不适用于所有情况,请检查您的VC是否设置为
self.tabBarController?.delegate = self
在您的ViewDidLoad()