我的视图控制器在模型中提供核心位置数据之前加载。
我有一个主视图控制器,它以两个NSManagedObject
子类(记录和位置)模式推送一个新的视图控制器,这些子类在prepareForSegue
方法中实例化。
if segue.identifier == "newRecord"
{
let controller = (segue.destinationViewController as! NewRecordVC)
let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate // instantiate the delegate methods in AppDelegate
let managedContext = appDelegate!.managedObjectContext // create context from delegate methods
let recordEntity = NSEntityDescription.entityForName("RecordData", inManagedObjectContext: managedContext)
let locationEntity = NSEntityDescription.entityForName("Location", inManagedObjectContext: managedContext)
controller.location = Location(entity: locationEntity!, insertIntoManagedObjectContext: managedContext)
controller.record = Record(entity: recordEntity!, insertIntoManagedObjectContext: managedContext)
controller.managedContext = appDelegate?.managedObjectContext
print("segueing")
}
对于各种值,两个托管对象都有inits
。记录具有分配给显示在新视图上的属性的简单预分配值。但是,位置属性主要需要位置服务来分配属性值。打印属性值显示虽然位置在viewDidLoad
中实例化,但位置服务分配的位置属性仍为零。位置服务正在运行 - 属性在模型中打印,但这是在viewDidLoad
之后。在加载时,我至少需要geoPlacemark
属性,它为视图提供文本。
override func viewDidLoad()
{
super.viewDidLoad()
...
if let recordNotNil = record
{
...
iD.text = "ID: \(recordNotNil.iD)"
}
if let locationNotNil = location
{
...
print("bing")
print(locationNotNil.temp)
record!.location = location!
print(location.geoPlacemark)
print(location.timestamp)
if let geoPlacemarkNotNil = location.geoPlacemark
{
print("bong")
locationText(geoPlacemarkNotNil)
}
}
}
我是否必须从每个视图控制器中运行位置服务,而不是模型?或者有没有办法让视图等待位置委托方法?
答案 0 :(得分:0)
在prepareForSegue()
中,destinationViewController已经实例化,并且viewDidLoad()
已被调用。
如果你想设置一个标签,你应该在viewWillAppear()
override func viewWillAppear() {
super.viewWillAppear()
// Set up your views here
}
viewWillAppear()
优于viewDidLoad()
的另一个好处是,每次ViewController即将显示时都会调用它(在VC生命周期中可以多次调用),而不是单个调用广告VC的生命周期开始为viewDidLoad()
。
答案 1 :(得分:0)
这里的问题来自于对NSManagedObject使用普通的覆盖初始化方法。
{{1}}
根据apple doc.s,应使用awakeFromInsert或awakeFromFetch启动自定义NSManagedObjects。