UITabBarControllerDelegate在两个独立的UIViewControllers上 - Swift

时间:2017-06-30 13:09:31

标签: ios swift uiviewcontroller uitabbarcontroller

我有以下代码,我试图实现"滚动到顶部"在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工作正常。

知道为什么会这样吗?

3 个答案:

答案 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()