2017-01-31 3 views
0

Я хочу передать строковые данные из родительского vc в дочерний vc в swift 3.
My child vc - вид контейнера. Так что смотрите мой код:Передача данных в дочерний контейнерный вид

class ParentViewController: UIViewController 
@IBOutlet var continerView: UIView! 
override func viewDidLoad() { 
     super.viewDidLoad() 
let vc = storyboard?.instantiateViewController(withIdentifier: "ChildVCID") as! ChildViewController! 
     vc?.myStr = "Hello Bro" 
     addChildViewController(vc!) 
     continerView.addSubview((vc?.view)!) 
     didMove(toParentViewController: vc) 
} 
} 

И мой код ребенка является:

class ChildViewController: UIViewController 
var myStr:String! 
override func viewDidLoad() { 
     super.viewDidLoad() 
} 
override func viewDidAppear(_ animated: Bool) { 
     print("Str is: ",myStr) 
    } 

Так эта ошибка будет показывать:
enter image description here

Поэтому, как это исправить?

+0

можете ли вы прикрепить свой проект ect –

+1

, пожалуйста, шаг за шагом, например, просто не передавайте данные напрямую, попробуйте сначала загрузить представление (добавить subview). Если его удастся, а затем передать данные, попробуйте изменить код var myStr: String! to var myStr: String ?. Я уверен, что ваш код правильный, только у вас что-то отсутствует с дополнительными. –

+1

Пожалуйста, правильно отформатируйте свой код. По крайней мере, убедитесь, что он правильно настроен. Есть много проблем, которые я могу определить. Ни один из классов не имеет открывающей скобки, вызов super.viewDidAppear не существует, выравнивание кода, пробелы между функциями, разворот силы - это зло ... и т. Д. –

ответ

2

Этот код содержит предложения, сделанные в комментариях, и не использует вскрытие силы.

class ParentViewController: UIViewController { 
    @IBOutlet var continerView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     guard let childViewController = storyboard?.instantiateViewController(withIdentifier: "ChildVCID") as? ChildViewController else { 
      print("Creating ViewController from ChildVCID failed") 
      return 
     } 

     childViewController.myStr = "Hello Bro!" 
     addChildViewController(childViewController) 
     continerView.addSubview(childViewController.view) 
     didMove(toParentViewController: self) 

    } 
} 

class ChildViewController: UIViewController { 
    var myStr:String? 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     print("Str is: ", myStr ?? "(nil)") 
    } 
} 
0

Безотносительно написан вопрос правильно, все просто не хватает одного главное, где раскадровки приходит в центре внимания, так как ChildViewController в раскадровке уже поместить его в ContainerView с вставлять seague, который автоматически загружает этот Биотех контейнер , и приложение разбилось beacause 'myStr' было силой развернутой, пока она равна нулю,

Я написал ParentViewController, минимальный '!' & '?', Почему использовать их, пока они не нужны.

class ParentViewController: UIViewController{ 
    @IBOutlet var cv: UIView! 
    override func viewDidLoad() { 
    super.viewDidLoad() 
    let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyBoard.instantiateViewController(withIdentifier: "idChildViewController") as! ChildViewController 
    vc.myStr = "Hello Bro" 
    addChildViewController(vc) 
    cv.addSubview(vc.view) 
    didMove(toParentViewController: vc) 
    } 
    } 
} 

Теперь в ChildViewController, почему объявить varible не обязательно,

class ChildViewController: UIViewController 
    var myStr:String? // or var myStr = "" //best way to declare string 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
    override func viewDidAppear(_ animated: Bool) { 
     print("Str is: ",myStr) 
    } 

Запустите приложение, даст консольный вывод в два раза,

Str является: ноль // загружается из раскадровка

Str: Необязательно («Hello Bro») // загружено с родителя

Смежные вопросы