我是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类的属性。有人可以提供一些帮助吗?
答案 0 :(得分:1)
ViewControllers在首次请求之前不会构建其视图。通常,这是在pushViewController
步骤期间,但不一定是这样。
此外,他们可能已将indoorLocationView
声明为可选,因为它是一个视图,并且在加载视图的其余部分时构造它。您需要明确检查nil
或使用?
运算符以避免在访问可能为nil
的属性时发生崩溃。
locationViewController.indoorLocationView?.rotateOnPositionUpdate = false
当indoorLocationView
为nil
时,此行不会崩溃,但也不起作用。您应该更改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
}
祝你好运