在ViewController类上设置值

时间:2015-01-23 18:50:23

标签: ios estimote

我是iOS开发的新手,但我尝试修改Estimote提供的example app(我正在使用他们的室内定位SDK)。在该示例中,有一个名为MenuViewController的ViewController类,它包含一个名为-loadLocationFromJSON()的函数。现在,在这个函数中,他们创建了一个名为locationViewController的ViewController的新实例,该实例被推送到navigationController。到目前为止,一切正常,位置文件正确构建并显示在屏幕上。

现在我要做的是创建一个位于MenuViewController类中的开关,该类可以切换LocationViewController上的属性。 locationViewController有一个名为rotateOnPositionUpdate的indoorLocationView属性,您可以将其设置为true或false。在我推送locationViewController之前,我想根据我的MenuViewController类中的开关设置该属性。这就是我到目前为止所拥有的:

@IBAction func loadLocationFromJSON() {
    let bundle = NSBundle.mainBundle()
    let path = bundle.pathForResource("location", ofType: "json")
    let content = NSString(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil) as String
    let location = ESTLocationBuilder.parseFromJSON(content)
    var locationViewController:LocationViewController = LocationViewController(nibName: "LocationViewController", bundle: nil)
    locationViewController.location = location
    // the following line is where the code fails
    locationViewController.indoorLocationView.rotateOnPositionUpdate = false

    self.navigationController?.pushViewController(locationViewController, animated: true)
}

正如你毫无疑问地注意到的,现在我只是试图将属性设置为false(甚至不用担心交换机的状态)......但是当我尝试构建它时失败了。调试器返回一个错误,说"致命错误:在解包一个Optional值"时意外地发现了nil。我不完全知道这意味着什么,我也不知道为什么我不能设置该locationViewController类的属性。有人可以提供一些帮助吗?

2 个答案:

答案 0 :(得分:1)

ViewControllers在首次请求之前不会构建其视图。通常,这是在pushViewController步骤期间,但不一定是这样。

此外,他们可能已将indoorLocationView声明为可选,因为它是一个视图,并且在加载视图的其余部分时构造它。您需要明确检查nil或使用?运算符以避免在访问可能为nil的属性时发生崩溃。

locationViewController.indoorLocationView?.rotateOnPositionUpdate = false

indoorLocationViewnil时,此行不会崩溃,但也不起作用。您应该更改LocationViewController的实现以直接接受此参数,然后将其传递到indoorLocationView或在您调用pushViewController后设置它。

答案 1 :(得分:0)

问题是此时indoorLocationView尚未加载到内存中。因此,您需要创建一个属性来存储Bool值。 var canRotateOnPositionUpdate中的LocationViewController,并在rotateOnPositionUpdate加载后设置indoorLocationView属性。我认为它将在viewWillAppear()处加载。如下所示:

    @IBAction func loadLocationFromJSON() {
    let bundle = NSBundle.mainBundle()
    let path = bundle.pathForResource("location", ofType: "json")
    let content = NSString(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil) as String
    let location = ESTLocationBuilder.parseFromJSON(content)
    var locationViewController:LocationViewController = LocationViewController(nibName: "LocationViewController", bundle: nil)
    locationViewController.location = location
    // the following line is where the code fails
    locationViewController.indoorLocationView.canRotateOnPositionUpdate = false

    self.navigationController?.pushViewController(locationViewController, animated: true)
}

然后

        func viewWillAppear(animated: Bool) {
        self.indoorLocationView.drawLocation(self.location)
        self.manager.startIndoorLocation(self.location)
        self.indoorLocationView.rotateOnPositionUpdate = self.canRotateOnPositionUpdate
    }

祝你好运