Я пытаюсь передать переменную из UITabController в UIViewController, но безуспешно? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть класс UITabController, внутри которого я создал экземпляр для пользовательского UINavigationBar, который заинтересован в передаче его высоты другому UIViewController. Ниже приведен код, который у меня есть внутри моего UITabController класса:

import UIKit

class NewFileButtonPressedTabController: UITabBarController, UINavigationBarDelegate
{
    let firstViewControllerInTabBar = FirstItemInTabBarOpenRolledSections()
    let secondViewControllerInTabBar = SecondItemInTabBarHollowStructuralSections()

    let navigationBar = CustomNavigationBar(navigationBarTitle: "'Blue Book' Catalogue Sections", leftBarButtonTarget: self, leftBarButtonSelector: #selector(buttonPressed(sender:)))

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationBar.delegate = self
        view.addSubview(navigationBar)

        firstViewControllerInTabBar.tabBarItem.image = UIImage(named: "notSelectedStateOpenSections")?.withRenderingMode(.alwaysOriginal)
        firstViewControllerInTabBar.tabBarItem.selectedImage = UIImage(named: "selectedOpenSections")?.withRenderingMode(.alwaysOriginal)
        firstViewControllerInTabBar.tabBarItem.tag = 0
        secondViewControllerInTabBar.tabBarItem.image = UIImage(named: "notSelectedHollowSections")?.withRenderingMode(.alwaysOriginal)
        secondViewControllerInTabBar.tabBarItem.selectedImage = UIImage(named: "selectedHollowSections")?.withRenderingMode(.alwaysOriginal)
        secondViewControllerInTabBar.tabBarItem.tag = 1
        let tabBarList = [firstViewControllerInTabBar, secondViewControllerInTabBar]

        viewControllers = tabBarList
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        navigationBar.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        navigationBar.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true

        if #available(iOS 11, *) {
            navigationBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        } else {
            navigationBar.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        }

        override func viewWillAppear(_ animated: Bool) {
            setupConstraints()
        }


        func setupConstraints() {
            firstViewControllerInTabBar.view.translatesAutoresizingMaskIntoConstraints = false
            firstViewControllerInTabBar.view.topAnchor.constraint(equalTo: navigationBar.bottomAnchor).isActive = true
            firstViewControllerInTabBar.view.bottomAnchor.constraint(equalTo: tabBar.topAnchor).isActive = true
            firstViewControllerInTabBar.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
            firstViewControllerInTabBar.view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        }
    }

    func position(for bar: UIBarPositioning) -> UIBarPosition {
        return UIBarPosition.topAttached
    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        if tabBarItem.tag == 0 {
            let sb = storyboard?.instantiateViewController(withIdentifier: "FirstItemInTabBarOpenRolledSections") as! FirstItemInTabBarOpenRolledSections
            print("tag 0 has been pressed")
            print(navigationBar.frame.size.height)
            sb.tabBarControllerNavigationBarHeight = navigationBar.frame.size.height
        }
    }
}

А ниже приведен код, который у меня есть внутри UIViewController, который в основном представляет собой вид, отображаемый при нажатии первого TabBarItem, которому я хотел бы передать высоту navigationBar:

import UIKit

class FirstItemInTabBarOpenRolledSections: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    var tabBarControllerNavigationBarHeight: CGFloat?

    override func viewDidLoad() {
        super.viewDidLoad()
        let customCollectionView = CustomCollectionView(layoutTopEdgeInset: 20, layoutBottomEdgeInset: 20, layoutLeftEdgeInset: 20, layoutRightEdgeInset: 20, totalWidthOfCollectionView: self.view.frame.width, totalHeightOfCollectionView: self.view.frame.height, minimumLayoutCellsHorizontalSpacing: 20, minimumLayoutCellsVerticalSpacing: 20, numberOfCellsPerRow: 2, numberOfCellsPerColumn: 4, viewThatCustomCollectionViewWillBeAddedTo: self.view, hostViewDelegate: self, hostViewDataSource: self)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 8
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let myCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath)
        myCell.backgroundColor = .blue
        return myCell
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("User tapped on itme \(indexPath.row)")
    }
}

Тем не менее, каждый раз, когда я печатаю значение высоты панели навигации во втором окне, я получаю ноль, что означает, что значение не было успешно передано. Может ли кто-нибудь помочь мне разобраться, что я сделал не так?

1 Ответ

0 голосов
/ 02 мая 2019

Кажется, что происходит то, что вы создаете новую копию вашей FirstItemInTabBarOpenRolledSections, используя storyboard?.instantiateViewController вашу override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) функцию. И затем вы устанавливаете свойство, которое вам нужно, для этой совершенно новой копии вашего View Controller, которая не имеет ничего общего с отображаемым контроллером представления.

Свойство, которое вы хотите изменить, это свойство из переменной firstViewControllerInTabBar в вашем классе NewFileButtonPressedTabController, поскольку именно эта копия вашего контроллера представления отображается. Так что метод didSelect вашего tabBar должен выглядеть примерно так:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

        if tabBarItem.tag == 0 {

            print("tag 0 has been pressed")

            print(navigationBar.frame.size.height)

            firstViewControllerInTabBar.tabBarControllerNavigationBarHeight = navigationBar.frame.size.height

        }

    }
...