在准备Segue时实例化的变量在ViewDidLoad中具有nil属性

时间:2016-04-12 09:48:22

标签: ios swift model-view-controller core-location

我的视图控制器在模型中提供核心位置数据之前加载。

我有一个主视图控制器,它以两个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)
        }
    }
}

我是否必须从每个视图控制器中运行位置服务,而不是模型?或者有没有办法让视图等待位置委托方法?

2 个答案:

答案 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。