SWIFT - 在viewdidload之外看不到的属性

时间:2015-04-01 15:05:18

标签: ios swift viewdidload

我尝试将一个字符串从VC1传递给VC2,但tex的值传递到属性detailItem,只是加载到viewdidload中,而不是在函数中

viewcontroller 1:

@IBOutlet var tex: UITextField!
// Prepare fore segue pass the value of txt

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier? == "Todo" {
    let navVC = segue.destinationViewController as UINavigationController
    let itemVC: ChecklistViewController = navVC.topViewController as ChecklistViewController
    itemVC.detailItem! = tex.text
  }
 }

viewcontroller 2:

var detailItem : String!

// I can see the value of tex only in the ViewDidLoad

override func viewDidLoad() {
  super.viewDidLoad()

  println("viewDidLoad \(detailItem)")
  tableView.rowHeight = 44
}

// Here and in  the function below result nil.
required init(coder aDecoder: NSCoder) {
  println("print init \(detailItem)")
  items = [ChecklistItem]()
  super.init(coder: aDecoder)
  loadChecklistItems()
}

func documentsDirectory() -> String {
  let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as [String]
  return paths[0]
}

func dataFilePath() -> String {
  println("print path\(detailItem)")
  return documentsDirectory().stringByAppendingPathComponent("Checklists.plist")
}

func saveChecklistItems() {
  let data = NSMutableData()
  let archiver = NSKeyedArchiver(forWritingWithMutableData: data)
  archiver.encodeObject(items, forKey: "ChecklistItems")
  archiver.finishEncoding()
  data.writeToFile(dataFilePath(), atomically: true)
  println("print save\(detailItem)")
}

func loadChecklistItems() {
  let path = dataFilePath()
  if NSFileManager.defaultManager().fileExistsAtPath(path) {
    if let data = NSData(contentsOfFile: path) {
      println("print load\(detailItem)")
      let unarchiver = NSKeyedUnarchiver(forReadingWithData: data)
      items = unarchiver.decodeObjectForKey("ChecklistItems") as [ChecklistItem]
      unarchiver.finishDecoding()
    }
  }
}

控制台输出:

print init 
print path
print load
viewDidLoad Antwerp

感谢Alberto

4 个答案:

答案 0 :(得分:2)

原因是,当调用prepareForSegue时,您的viewcontroller 2已经创建并且viewDidLoad已被调用。

查看This Link,因为它有一个很好的视图生命周期写入

答案 1 :(得分:0)

您将能够在viewDidLoad之后调用的所有其他函数中查看该属性。 因为您在创建视图后设置了属性,所以当您没有设置属性时,首先调用这些函数。

尝试在viewDidLoad中调用您的函数。

答案 2 :(得分:0)

您无法在初始值设定项中看到此属性,因为该代码在 itemVC.detailItem! = tex.text之前被称为

您可以将来电loadChecklistItems()移至viewDidLoad()。您还可以在设置详细信息项后立即加载项目:

var detailItem : String! {
    didSet {
        loadChecklistItems()
    }
}

答案 3 :(得分:0)

根据UIViewController的生命周期,viewDidLoad方法被完全调用,让你知道控制器的视图,以及在这种情况下对我们来说有趣的所有IBOutlets。这意味着只有在调用viewDidLoad时才允许您依赖于outlet的状态。有关更多信息,请参阅https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/上的“UIViewController类参考”。