Swift — избавьтесь от путаницы данных Segue Pass

Я пробовал передавать данные назад из моего перехода к раскрутке несколькими способами. Похоже, что данные не отправляются или отправляются после viewDidLoad(), поэтому метка, которую я пытаюсь установить, не обновляется. Откат работает, и ниже я использую подготовку к переходу с некоторым успехом, чтобы изменить заголовок предыдущего контроллера представления на «новый заголовок», но последняя строка не устанавливает для nbaRotoHome.player «имя нового игрока».

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "BuyStatsTapPager" {
        let nav = segue.destination as! UINavigationController


        let buyStatsTapPager = nav.viewControllers[0] as! BuyStatsTabPager
            buyStatsTapPager.selectedPlayerBuyStats = selectedPlayer
            buyStatsTapPager.buyStatsRef = self

    }

    if segue.identifier == "unwindToViewController1" {

        var viewControllers: [UIViewController] = mainNavigationController.viewControllers as [UIViewController];

        if(viewControllers.count == 3){
            viewControllers.remove(at: viewControllers.count-2)
            mainNavigationController?.viewControllers = viewControllers
        }

        let enteredContestViewController = viewControllers[viewControllers.count-1]
        enteredContestViewController.title = "new title"

        self.presentingViewController?.dismiss(animated: true, completion: nil)

        let nbaRotoHome = segue.destination as! NBARotoHome

        nbaRotoHome.player = "new player name"


    }

Вернувшись в мой предыдущий контроллер представления, у меня есть

@IBAction func prepareForUnwind(segue: UIStoryboardSegue) {


}

И после просмотра этого вопроса Передача данных с переходом на раскрутку я также попытался получить данные таким образом в предыдущем контроллере представления

 @IBAction func prepareForUnwind(segue: UIStoryboardSegue) {
    if let sourceViewController = segue as? BuyStats {
        playerNameLabel.text = sourceViewController.playerName
    }
}

Если мне нужно добавить больше деталей к тому, что я пытаюсь сделать, пожалуйста, спросите, и я отредактирую. Хотел задать вопрос, но затрудняюсь сформулировать.


person Louis Sankey    schedule 24.04.2017    source источник


Ответы (1)


Похоже, что данные не отправляются или отправляются после viewDidLoad(), поэтому метка, которую я пытаюсь установить, не обновляется.

В переходе назад вы возвращаетесь к уже созданному viewController, поэтому viewDidLoad произошло давным-давно до того, как вы перешли к другому viewController.


Если вы используете переходы, вам не следует возиться с массивом viewControllers в navigationController или вызывать dismiss. Все это сделает откатить переход. Просто получите назначение в prepare(for:sender:) и установите данные:

if segue.identifier == "unwindToViewController1" {

    let nbaRotoHome = segue.destination as! NBARotoHome

    nbaRotoHome.player = "new player name"
}

или в своем prepareForUnwind получите источник и прочитайте данные:

В этой строке вам не хватает .source. Сдача:

if let sourceViewController = segue as? BuyStats

to:

if let sourceViewController = segue.source as? BuyStats
person vacawama    schedule 24.04.2017
comment
Спасибо за ответ. Однако у меня все еще есть проблемы. Если viewDidLoad() уже был вызван, то как он обновляется новыми данными? Скажем, я уже установил метку в viewDidLoad() и теперь хочу изменить ее при раскрутке. Разве не должно произойти что-то еще (например, снова вызвать viewDidLoad()), или все, что вам нужно сделать, это переназначить переменную? Я пробовал это, и мне не повезло. - person Louis Sankey; 27.04.2017
comment
Поместите код, который обновляет метку, в отдельный метод. Вызовите этот метод из viewDidLoad() и из места приземления раскрутки, которое вы назвали prepareForUnwind. - person vacawama; 28.04.2017