0

私は iOS 開発は初めてですが、Estimote が提供するサンプル アプリを変更しようとしています (Indoor Positioning SDK を使用しています)。この例では、-loadLocationFromJSON() という関数を含む MenuViewController という ViewController クラスがあります。ここで、この関数内で、locationViewController と呼ばれる ViewController の新しいインスタンスを作成します。これは、navigationController にプッシュされます。これまでのところ、すべて正常に動作し、ロケーション ファイルが正しく構築され、画面に表示されます。

ここでやりたいことは、LocationViewController の属性を切り替えることができる MenuViewController クラスにあるスイッチを作成することです。locationViewController には、true または false に設定できる、rotateOnPositionUpdate と呼ばれるその IndoorLocationView のプロパティがあります。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

indoorLocationViewがの場合nil、この行はクラッシュしませんが、影響もありません。LocationViewControllerこのパラメータを直接受け入れるように の実装を変更してから に渡すか、indoorLocationViewを呼び出した後に設定する必要がありますpushViewController

于 2015-01-23T19:05:11.373 に答える
0

問題は、indoorLocationViewこの時点ではまだメモリにロードされていないことです。そのため、ブール値を格納するプロパティを作成する必要があります。 var canRotateOnPositionUpdateロード後にプロパティLocationViewControllerを設定します。のいずれかの時点でロードされると思います。次のように:rotateOnPositionUpdateindoorLocationViewviewWillAppear()

    @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 に答える