2017-02-18 4 views
1

Мне было интересно, может ли кто-нибудь объяснить, почему выходные точки, которые являются объектами просмотра целевого ViewController в функции prepareForSegue(), установлены на нуль. Я могу только догадываться, что это означает, что в то время, когда вызывается PrepareForView, эти объекты еще не созданы. Разве это не имело бы смысла, хотя к тому моменту, когда у вас есть объект ViewController для вашего назначения, у вас также были бы инициализированы выходы объекта представления, связанные с ним? Я также знаю, что, вероятно, не очень хорошая практика напрямую изменять значения другого представления ViewController, но я просто хочу лучше понять внутреннюю работу Swift 3. Благодаря!Зачем просматривать объекты назначения ViewController по умолчанию для nil в prepareForSegue?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ItemController" 
    { 
     let indexPath = tableView.indexPathForSelectedRow?.row 
     if let itemStruct = itemList[indexPath!] as ItemStruct? 
     { 
      let correspondingItemController : ItemController = segue.destination as! ItemController 

      if let textView = correspondingItemController.textView 
      { 
       print("This is not nil!") //this will NOT get hit. Why is this still nil?? 
      } 

      correspondingItemController.itemStruct = itemStruct 
     } 
    } 
} 
+1

Ответ: _at время 'подготовки (для segue' называется, эти объекты не создаются yet_ –

ответ

2

Как сказал во время prepareForSegue объектов выпускных еще не созданы. ViewController загружает/создает его представление при доступе к объекту view. Когда вызывается prepareForSegue, ваш диспетчер вида назначения запутан, но его view еще не загружен. Вы можете заставить контроллер загрузить свой вид из prepareForSegue, обратившись к объекту view.

let correspondingItemController : ItemController = segue.destination as! ItemController 
let _ = correspondingItemController.view // Forces controller to load its view. 

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

// prepareForSegue 
correspondingItemController.name = "something" 

// Destination controller 
var name:String 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    textView.text = name 
} 
+0

Прочитайте ваш ответ все не так, upvoted :) –

+0

Анил, да, подход, который вы предлагаете, - это то, что я делал. Приятно знать, что вы также можете заставить взглянуть. Благодаря! – reservoirman

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