Swift: передать данные первому дочернему элементу NavigationController, созданному с помощью storyboardID - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу передать данные в первый viewController, который встраивается в navigationController.

Для доступа к этому навигационному контроллеру у него есть storyBoardID, я прихожу к экземпляру navigationController, но не могу передать ему данные,

Вот мой код:

extension UINavigationController {

func dismissAndPresentNavigationController(from storyboard: UIStoryboard?, identifier: String) {
    guard let navigationController = storyboard?.instantiateViewController(withIdentifier: identifier) as? UINavigationController else { return }

    print("OK")
    if let nav = navigationController.navigationController?.viewControllers.first as? ChatBotViewController{
        print("OK2")
    }

    self.dismiss(animated: false, completion: nil)
    self.present(navigationController, animated: true, completion: nil)
}

}

Идентификатор, который я ввел в параметр, - это storyBoardID контроллера навигации.

Как передать данные на первый контроллер navigationcontroller?

РЕШЕНИЕ:

extension UINavigationController {

func dismissAndPresentNavigationController(from storyboard: UIStoryboard?, identifier: String, with fittoBottle: FittoBottle) {
    guard let navigationController = storyboard?.instantiateViewController(withIdentifier: identifier) as? UINavigationController else { return }

    if let nav = navigationController.viewControllers.first as? ChatBotViewController{
        nav.fittoBottle = fittoBottle
    }

    self.dismiss(animated: false, completion: nil)
    self.present(navigationController, animated: true, completion: nil)
}

Ответы [ 2 ]

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

Для связи между контроллерами представления в приложении для iOS лучше всего использовать protocol (делегат) или Notification. В вашем случае расширение UINavigationController не является хорошей идеей, потому что вы не должны передавать методы расширения на контроллер представления экземпляра, а затем передавать на него какие-либо данные, а в качестве метода расширения ответственность за UINavigationController не лежит на позаботьтесь о ChatBotViewController или любых других экземплярах контроллеров.

По моему предложению, в любом месте, где вы хотите показать ChatBotViewController, на вашей раскадровке создайте модальный переход к ChatBotViewController (который встроен в UINavigationController) и используйте performSegue(withIdentifier:sender:) для запуска контроллера навигации и переопределения prepare(for:sender:) чтобы установить данные, которые вы хотите передать в ChatBotViewController.

Вот несколько кодов для объяснения:

import UIKit

struct FittoBottle {

}

class ChatBotViewController: UIViewController {

  var fittoBottle = FittoBottle()

}

class ViewController: UIViewController {

  func showChatController() {

    /*
     If there is any controller is presented by this view controller
     or one of its ancestors in the view controller hierarchy,
     we will dismiss it first.
     */
    if presentedViewController != nil {

      dismiss(animated: true) {
        self.showChatController()
      }
      return

    }

    // Data that will be sent to the new controller
    let fittoBottle = FittoBottle()

    // ChatBotViewControllerSegue is the segue identifier set in your storyboard.
    performSegue(withIdentifier: "ChatBotViewControllerSegue", sender: fittoBottle)


  }

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

    guard let navigationController = segue.destination as? UINavigationController else {
      return
    }

    guard let chatBotController = navigationController.viewControllers.first as? ChatBotViewController else {
      return
    }

    // Get the data from sender, if not found, create it there.
    // Or if you don't pass it through sender, you can specify it here.
    let fittoBottle = sender as? FittoBottle ?? FittoBottle()
    chatBotController.fittoBottle = fittoBottle


  }

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

После создания экземпляра контроллера навигации из раскадровки вы сможете получить доступ к контроллеру корневого представления через navigationController.viewControllers.first.

guard let navigationController = storyboard?.instantiateViewController(withIdentifier: identifier) as? UINavigationController else { return }

if let chatBotViewController = navigationController.viewControllers.first as? ChatBotViewController {
    chatBotViewController.fittoBottle = fittoBottle
}

self.dismiss(animated: false, completion: nil)
self.present(navigationController, animated: true, completion: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...