簡體   English   中英

SWIFT-在viewdidload外看不到屬性

[英]SWIFT - Property not seen outside 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

謝謝阿爾貝托

原因是因為調用prepareForSegue時,已經創建了viewcontroller 2並調用了viewDidLoad

查看此鏈接,因為它可以很好地記錄視圖生命周期

您將能夠在viewDidLoad之后調用的所有其他函數中查看該屬性。 由於您是在創建視圖之后設置屬性的,因此,當您尚未設置屬性時,將首先調用這些函數。

嘗試在viewDidLoad中調用函數。

您無法在初始化程序中看到此屬性,因為該代碼是 itemVC.detailItem! = tex.text 之前 itemVC.detailItem! = tex.text itemVC.detailItem! = tex.text

您可以loadChecklistItems()調用移到viewDidLoad() 您還可以在設置明細項目后立即加載這些項目:

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

根據UIViewController的生命周期,將精確調用viewDidLoad方法,以使您知道控制器的視圖以及在所有情況下對我們而言有趣的是所有IBOutlet。 這意味着僅當調用viewDidLoad時,才允許您依賴網點的狀態。 有關更多信息,請參閱https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/上的“ UIViewController類參考”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM