2015-01-23 8 views
0

저는 iOS 개발을 처음 사용했지만 Estimote에서 제공 한 example app을 수정하려고합니다 (실내 위치 지정 SDK를 사용하고 있습니다). 이 예제에서는 MenuViewController라는 ViewController 클래스에 -loadLocationFromJSON()이라는 함수가 있습니다. 이제이 함수 내부에서 navigationController에 푸시 된 locationViewController라는 ViewController의 새 인스턴스를 만듭니다. 지금까지는 모든 것이 잘 작동하고 위치 파일이 올바르게 빌드되어 화면에 표시됩니다.ViewController 클래스의 값 설정

이제 내가하고 싶은 것은 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) 
} 

는, 지금 난 그냥 거짓 (그리고 심지어 스위치의 상태에 대해 걱정)에 속성을 설정하려고 해요 ...하지만이 : 여기에 지금까지 가지고 무엇을 내가 그것을 만들려고 할 때 실패합니다. 디버거에서 "치명적인 오류 : 예기치 않게 옵션 값을 래핑하지 않는 동안 nil이 발견되었습니다"라는 오류를 반환합니다. 이것이 무엇을 의미하는지 완전히 알지 못하고 왜 locationViewController 클래스의 속성을 설정할 수 없는지 알지 못합니다. 누군가 도움을 줄 수 있습니까?

답변

1

ViewControllers은 자신의 견해를 구성하지 않습니다 단지 다음과 같이. 대개 이것은 pushViewController 단계에 있지만 반드시 그런 것은 아닙니다.

또한보기가 아니기 때문에 indoorLocationView을 선택 사항으로 선언했으며보기의 나머지 부분이로드 될 때 구성합니다. nil 일 수있는 속성에 액세스 할 때 충돌을 피하려면 nil을 명시 적으로 확인하거나 ? 연산자를 사용해야합니다. indoorLocationViewnil 경우

locationViewController.indoorLocationView?.rotateOnPositionUpdate = false 

,이 라인은 충돌하지 않을 것이다, 그러나 그것은 또한 아무런 영향을주지 않습니다. LocationViewController 구현을 변경하여이 매개 변수를 직접 허용 한 다음 을 호출 한 후 해당 매개 변수를 indoorLocationView으로 전달하거나 설정하십시오.

+0

도움을 주셔서 감사합니다. "?" 연산자는 충돌로부터 그것을 지켰습니다 ...하지만 당신이 말했듯이 ... 코드 라인은 실제로 아무런 효과가 없습니다. 그것은 LocationViewController가 MenuViewController에서이 값을 받아들이는 것처럼 보이지만 이동하는 방법이 될 것입니다 ...하지만 어떻게 해야할지 잘 모르겠습니다. 어떤 아이디어? – andyopayne

+0

'LocationViewController' 클래스에 속성을 추가 한 다음'indoorLocationView'의 속성을'viewDidLoad' 내부의 해당 값으로 설정하십시오. –

+0

오른쪽 ... 나는 그것을 이해할 수있다. 하지만, 내가 원하는 것은 LocationViewController 외부에서 값을 갖는 것입니다. 따라서, LocationViewController 내에서 indoorLocationView의 속성을 어떻게 든 설정하는 MenuViewController의 저장된 부울 값 (이상적으로 스위치에서 오는 값)이있을 것입니다. 말이 돼? 그래서 MenuViewController는 푸시 될 때 LocationViewController에 값을 전달해야합니다 ... 또는 LocationViewController는로드 된 후 MenuViewController에서 값을 가져와야합니다. 어느 쪽을하는지 잘 모르겠습니다. – andyopayne

0

indoorLocationView이 (가) 아직 메모리에로드되지 않았습니다. 따라서 Bool 값을 저장하는 속성을 만들어야합니다. var canRotateOnPositionUpdateLocationViewController으로 설정하고 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 
    } 

행운

+0

LocationViewController 안의 ViewDidLoad() 함수를 의미한다고 가정합니다. 그래서 가정하면, 어떻게 든 부모 ViewController (MenuViewController)의 Bool 값에 액세스해야합니다. 그래서, 어떻게해야합니까? 정말로 초보자 용 질문이라면 유감입니다.하지만 제가 말했듯이, 저는 이것에 대해 처음이에요. – andyopayne

+0

답변을 업데이트했습니다. 그냥 좀 봐 :) –

+0

난 아직도이 문제를 해결 모르겠어요. 만약 내가 LocationViewController에서 변수를 만들고 있는데, canWotAppOnPositionUpdate를 호출하고 viewWillAppear() 함수 내에서 속성을 업데이트하면 ... 모든 것이 여전히 LocationViewController 안에 있습니다.내가 원하는 건 어떻게 든 MenuViewController에서 LocationViewControl 내부의 속성을 제어하는 ​​것입니다. 그래서, 어쨌든 MenuViewController에서 LocationViewController로 변수를 전달해야합니다 ...하지만 그 일을하는 데 문제가 있습니다. – andyopayne