SWIFT - 属性 未在 viewdidload 外看到
SWIFT - Property not seen outside viewdidload
我尝试将一个字符串从 VC1 传递到 VC2,但是传递到 属性 detailItem 的 tex 值只加载到 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
谢谢阿尔贝托
您将能够在 viewDidLoad 之后调用的所有其他函数中看到 属性。
因为您是在创建视图之后设置 属性,所以当您尚未设置 属性 时,将首先调用这些函数。
尝试在 viewDidLoad 中调用您的函数。
您在初始化程序中看不到此 属性,因为该代码在 before itemVC.detailItem! = tex.text
.
中被调用
您可以将对 loadChecklistItems()
的呼叫移至 viewDidLoad()
。您还可以在设置详细信息项目后立即加载项目:
var detailItem : String! {
didSet {
loadChecklistItems()
}
}
原因是因为当prepareForSegue
被调用时你的viewcontroller 2
已经被创建并且viewDidLoad
被调用了。
查看 This Link,因为它对视图生命周期有很好的描述
根据 UIViewController 的生命周期,调用 viewDidLoad 方法正是为了让您知道控制器的视图,以及在这种情况下我们感兴趣的所有 IBOutlets。这意味着只有在调用 viewDidLoad 后,您才可以依赖 outlet 的状态。有关详细信息,请参阅 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/ 中的 "UIViewController Class Reference"。
我尝试将一个字符串从 VC1 传递到 VC2,但是传递到 属性 detailItem 的 tex 值只加载到 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
谢谢阿尔贝托
您将能够在 viewDidLoad 之后调用的所有其他函数中看到 属性。 因为您是在创建视图之后设置 属性,所以当您尚未设置 属性 时,将首先调用这些函数。
尝试在 viewDidLoad 中调用您的函数。
您在初始化程序中看不到此 属性,因为该代码在 before itemVC.detailItem! = tex.text
.
您可以将对 loadChecklistItems()
的呼叫移至 viewDidLoad()
。您还可以在设置详细信息项目后立即加载项目:
var detailItem : String! {
didSet {
loadChecklistItems()
}
}
原因是因为当prepareForSegue
被调用时你的viewcontroller 2
已经被创建并且viewDidLoad
被调用了。
查看 This Link,因为它对视图生命周期有很好的描述
根据 UIViewController 的生命周期,调用 viewDidLoad 方法正是为了让您知道控制器的视图,以及在这种情况下我们感兴趣的所有 IBOutlets。这意味着只有在调用 viewDidLoad 后,您才可以依赖 outlet 的状态。有关详细信息,请参阅 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/ 中的 "UIViewController Class Reference"。