ViewController class 上的设置值

Setting value on ViewController class

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

现在我要做的是创建一个位于菜单ViewController class 中的开关,它可以切换位置ViewController 上的属性。 locationViewController 的 indoorLocationView 有一个名为 rotateOnPositionUpdate 的 属性,您可以将其设置为 true 或 false。在我按下位置​​ ViewController 之前,我想根据我的菜单 ViewController class 中的开关设置那个 属性。这是我目前所拥有的:

@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(甚至不担心开关的状态)...但是当我尝试这样做时失败了建造它。调试器 returns 错误提示 "fatal error: unexpectedly found nil while unwrapping an Optional value"。我不完全知道这是什么意思,我也不知道为什么我不能设置那个位置的 属性 ViewController class。有人可以提供一些帮助吗?

问题是 indoorLocationView 此时尚未加载到内存中。所以需要做一个属性来存储Bool值。 var canRotateOnPositionUpdate in LocationViewController 并在 indoorLocationView 加载后设置 rotateOnPositionUpdate 属性。我认为它会在 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
    }

祝你好运

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

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

的属性时发生崩溃
locationViewController.indoorLocationView?.rotateOnPositionUpdate = false

indoorLocationViewnil时,这一行不会崩溃,但同样没有作用。您应该更改 LocationViewController 的实现以直接接受此参数,然后将其传递给它的 indoorLocationView 或在调用 pushViewController.

后设置它