Как я могу вернуть collectionView наверх, когда нажата иконка tabBar для соответствующего контроллера представления? - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь создать приложение для социальных сетей в swift, которое имеет панель вкладок с 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: фатальная ошибка: неожиданно найден ноль при неявном развертывании необязательного значения

в этой строке кода:

HomeVC?.collectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)

1 Ответ

0 голосов
/ 15 июня 2019

Загрузка 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

    }
}

Вы должны сохранить Selected ViewController в переменной, поэтому при изменении ViewController с одной вкладки на другую она просто изменит ViewController, а когда вы снова нажмете на ту же вкладку, она прокрутит вас обратно вверх. Вот как iOS делает это во всех своих приложениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...