2017-02-18 54 views
1

我想知道是否有人可以解释为什么在prepareForSegue()函数中目标ViewController的视图对象的出口设置为零。我只能猜测这意味着在PrepareForView被调用时,这些对象还没有被创建。虽然当你有你的目的地ViewController对象时,你是否会将与它相关的视图对象插座初始化?我也知道直接修改另一个ViewController视图的值可能不是好习惯,但我只想更好地理解Swift 3的内部工作。谢谢!为什么在prepareForSegue中,目标ViewController的视图对象默认为零?

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尚未加载。您可以通过访问view属性强制控制器从prepareForSegue加载其视图。

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 :) – 2017-02-18 08:22:27

+0

阿尼尔,是的,你建议的方法是我一直在做的。很高兴知道你也可以强制观看。谢谢! – reservoirman

相关问题