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
当indoorLocationView
为nil
时,这一行不会崩溃,但同样没有作用。您应该更改 LocationViewController
的实现以直接接受此参数,然后将其传递给它的 indoorLocationView
或在调用 pushViewController
.
后设置它
我是 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
当indoorLocationView
为nil
时,这一行不会崩溃,但同样没有作用。您应该更改 LocationViewController
的实现以直接接受此参数,然后将其传递给它的 indoorLocationView
或在调用 pushViewController
.