0

我是 iOS 开发的新手,但我正在尝试修改 Estimote 提供的示例应用程序(我正在使用他们的 Indoor Positioning 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(甚至不用担心开关的状态)......但是当我尝试构建它时失败了。调试器返回一个错误,说“致命错误:在展开可选值时意外发现 nil”。我不完全知道这意味着什么,也不知道为什么我不能设置该 locationViewController 类的属性。有人可以提供一些帮助吗?

4

2 回答 2

1

ViewController 在第一次被请求之前不会构造它们的视图。通常,这是在pushViewController步骤期间,但并非必须如此。

此外,他们很可能已声明indoorLocationView为可选,因为它是一个视图,并且在加载视图的其余部分时构建它。nil在访问?可能是nil.

locationViewController.indoorLocationView?.rotateOnPositionUpdate = false

indoorLocationViewis时nil,这条线不会崩溃,但它也没有效果。您应该更改 的实现LocationViewController以直接接受此参数,然后将其传递给它,indoorLocationView或者在您调用pushViewController.

于 2015-01-23T19:05:11.373 回答
0

问题是此时indoorLocationView尚未加载到内存中。因此,您需要创建一个属性来存储 Bool 值。 var canRotateOnPositionUpdatein并在加载后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
    }

祝你好运

于 2015-01-23T18:55:40.243 回答