2016-11-28 2 views
1

제목이 혼란 스럽습니다. 더 의미있는 방법을 알지 못했습니다. githubUIView는 prepareForSegue 메소드에서 nil입니다.

내가 popView에 몇 레이블을 추가 secondaryVieController로 연결 한 :

나는이 예제를 사용하여 정보 창을 구현했다.

I가 PrimaryViewController에 prepareForSegue 방법 개정 한 :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "showInfo" { 

      let info = segue.destinationViewController as! SecondaryViewController 
      info.adrLabel.text = branch.address 
      info.nameLabel.text = branch.name 
      info.telLabel.text = branch.tel 

      dim(.In, alpha: dimLevel, speed: dimSpeed) 
    } 
} 

하지만 그것을 실행할 때 오류 "치명적인 오류 : 예기치 않게하는 옵션 값 풀기 동안 전무 발견"얻을이 정보 때문이다

합니다. popupView는 nil입니다.

하지만 어떻게 설정해야합니까? 추가 레이블이 없으면 왜 제대로 작동하는지.

감사합니다.

답변

2

info.adrLabel.text = branch.address 
info.nameLabel.text = branch.name 
info.telLabel.text = branch.tel 

값이 SecondaryViewControllerviewDidLoad()됩니다 액세스됩니다 첫 번째 방법.

변수를 만들고 해당 변수에 값을 할당해야하며 해당 변수를 사용하여 레이블에 값을 할당 할 수있는 viewDidLoad()에서 값을 할당해야합니다.

+0

예, 확실히 작동합니다. 2 분 안에 받아 들일 수있을 것입니다. 하지만 왜 그런 일이 일어나고있는 걸까요? uiview가 아직로드되지 않았으므로 뷰 내부에 레이블을 할당 할 수없는 이유는 무엇입니까? 또는보기? thanks again – Almazini

+0

당신의 view는'prepareForSegue' 메쏘드에서 초기화되지 않습니다. 모든 UIViewController 뷰는 viewDidLoad에서 초기화 될 것이고, 변수에 옵션 바인딩을 사용하고 그 변수를 nil로 가질 때마다 앱이 추락 할 것입니다. – Rajat

1

prepareForSegue 메소드에서보기가로드되기 전에 값을 설정하려고하므로 nil이 표시됩니다. 대신 설치가 값을 포함하고있는 viewDidLoad에 레이블을 설정하려면 SecondaryViewController에 일부 변수 :

class SecondaryViewController { 
     var address: String? 
     var name: String? 
     var tel: String? 

     override func viewDidLoad() { 
     adrLabel.text = address 
     nameLabel.text = name 
     telLabel.text = tel 
     } 
    } 

을 이제 당신이 당신의 prepareForSegue에 할 필요가있다 : 일반적으로

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "showInfo" { 

     let info = segue.destinationViewController as! SecondaryViewController 
     info.address = branch.address 
     info.name = branch.name 
     info.tel = branch.tel 

     dim(.In, alpha: dimLevel, speed: dimSpeed) 
    } 
    } 
+0

고마워요! 나는 당신의 답변도 투표했지만 우리 동료의 대답은 처음이었다. – Almazini

+0

기꺼이 도울 수 있었다. – gwinyai

1

당신 다른 뷰 컨트롤러의 뷰를 직접 조작해서는 안됩니다. 그것은 캡슐화의 원칙을 위반합니다. 그들을 비공개로 생각해야합니다.

대신 대상보기 컨트롤러에 속성을 추가하고 해당 속성을 설정하십시오. 그런 다음 대상보기 컨트롤러의 viewWillAppear 메서드에서 해당 속성의 값을 적절한보기에 설치합니다.

그런 식으로 나중에 뷰 컨트롤러의 의견을 변경 한 경우에는 하나 개의 장소 (뷰 컨트롤러)

가의 코드를 변경해야 (플러스, 당신의 prepareForSegue 기능과 같은 상황에서는 작동하지 않습니다.)

+0

Duncan과 같은 훌륭한 설명에 감사드립니다! 나는 당신의 대답에 대해 투표했습니다. – Almazini