iOS -Как найти ChildVC в стеке NavigationController после того, как родительский элемент нажал на AnotherVC - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть tabBar с вкладкой, которая содержит NavVC, у которого есть корень как ParentVC. ParentVC имеет сегментированный контроль, который управляет двумя дочерними виртуальными контроллерами, RedVC и BlueVC. И RedVC, и BlueVC содержат кнопку для нажатия на YellowVC.

Проблема заключается в том, что YellowVC включается, и в его viewDidLoad я проверяю, чтобы увидеть контроллеры представления в стеке, и появляются два контроллера - ParentVC и YellowVC, нет упоминания ни о RedVC (если он нажимает на него) или BlueVC (если он нажимает на него).

for controller in navigationController!.viewControllers {

    print(controller.description) // will only print ParentVC and YellowVC
}

Я понимаю, что поскольку tabBar имеет navVC в качестве вкладки, а его корень - это ParentVC, то это корень push, но мне нужно знать, какой из RedVC или BlueVC вызвал его, когда YellowVC выдвигается ,

Я могу использовать некоторые свойства класса в YellowVC, но я хочу посмотреть, есть ли другой способ с помощью navigationController:

var pushedFromRedVC = false // I'd prefer not to use these if I don't have to
var pushedFromBlueVC = false

Как получить ссылку на RedVC или BlueVC, когда кто-либо из них нажмет на YellowVC?

class MyTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let parentVC = ParentVC()
        let navVC = UINavigationController(rootViewController: parentVC)
        navVC.tabBarItem = UITabBarItem(title: "Parent", image: nil), tag: 0)

        viewControllers = [navVC]
    }
}

class ParentVC: UIViewController {

    var segmentedControl: UISegmentedControl! // switching segments will show either the redVC or the blueVC
    let redVC = RedController()
    let blueVC = BlueController()

    override func viewDidLoad() {
        super.viewDidLoad()

        addChildViewController(redVC)
        view.addSubview(redVC.view)
        redVC.didMove(toParentViewController: self)

        addChildViewController(blueVC)
        view.addSubview(blueVC.view)
        blueVC.didMove(toParentViewController: self)
    }
}

class RedVC: UIViewController {

    @IBAction func pushYellowVC(sender: UIButton) {

        let yellowVC = YellowVC()
        yellowVC.pushedFromRedVC = true // I'd rather not rely on this
        navigationController?.pushViewController(yellowVC, animated: true)
    }
}

class BlueVC: UIViewController {

    @IBAction func pushYellowVC(sender: UIButton) {

        let yellowVC = YellowVC()
        yellowVC.pushedFromBlueVC = true  // I'd rather not rely on this
        navigationController?.pushViewController(yellowVC, animated: true)
    }
}

class YellowVC: UIViewController {

    var pushedFromRedVC = false // only sample, I'd rather not use these if I don't have to
    var pushedFromBlueVC = false

    override func viewDidLoad() {
        super.viewDidLoad()


        for controller in navigationController!.viewControllers {
            // even though the push is triggered from either the RedVC or BlueVC it will only print ParentVC and YellowVC
            print(controller.description)
        }
    }
}

1 Ответ

0 голосов
/ 04 ноября 2018

Поскольку RedVC и BlueVC содержатся в ParentVC, вы не найдете ссылок на них в стеке UINavigationController.

Альтернативой использованию двух логических значений является использование свойства sourceVC:

class YellowVC: UIViewController {

    var sourceVC: UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()

        if self.sourceVC is BlueVC {
           print("We came from Blue")
        } else if self.sourceVC is RedVC {
           print("We came from Red")
        } else {
           print("We came from somewhere else"
        }
    }
}


class RedVC: UIViewController {

    @IBAction func pushYellowVC(sender: UIButton) {

        let yellowVC = YellowVC()
        yellowVC.sourceVC = self 
        navigationController?.pushViewController(yellowVC, animated: true)
    }
}

class BlueVC: UIViewController {

    @IBAction func pushYellowVC(sender: UIButton) {

        let yellowVC = YellowVC()
        yellowVC.sourceVC = self  
        navigationController?.pushViewController(yellowVC, animated: true)
    }
}

Возможно, вам придется подумать о том, нужно ли YellowVC вызывать какой-либо метод для Red/BlueVC или просто нужно знать какое-то состояние, которое подразумевается источником Red / Blue.

Если это последнее, то RedVC и BlueVC, вероятно, должны использовать шаблон делегирования, чтобы сообщить ParentVC, что он должен нажать YellowVC, и установить соответствующие свойства состояния на основе источника вызова делегирования.

Вы могли бы также рассмотреть возможность добавления в вашу модель состояния, которое передается в VC, а не в отдельные свойства самих VC.

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