2016-08-02 5 views
1

이전 ViewController에서 전달 된 비 선택적 속성이있는 Swift ViewController를 어떻게 초기화합니까?위의 ViewController에서 전달 된 비 선택적 속성이있는 Swift ViewController를 초기화하는 방법은 무엇입니까?

가정하십시오 : 모든 viewControllers가 mainStoryboard과 비 선택적인 속성은 부모의 prepareForSegue 방법에 childViewController로 설정되어 있는지 연결되어 있는지

. ChildVC가이 모델 객체없는 일이 할 수 없기 때문에

class ParentVC{ 
    override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "playlistsSegue" { 
      let vc = (segue.destination as! PlaylistsVC) 
      vc.set = attachedSet 
      vc.title = attachedSet?.name 
     } 
    } 
} 

세트 속성은 비 선택해야합니다. 문제의 부동산을 선택 사항으로 사용하게되어서 분리에 시간이 걸리는 버그가 발생했습니다. segue 패턴이 항상 나타나기 때문에 초기화 문제의 일부로이 속성을 강제 설정하면 현재와 미래에 피할 수 있습니다.

class ChildVC{ 
var set:ModelObject 
} 
+0

을 스토리 보드를 사용할 때 당신은 할 수 없습니다, 그래서 당신은 당신의 자신의 이니셜 라이저를 사용할 수 없습니다 속성이 아닌 선택 사항입니다. 일반적으로 암시 적으로 unwrap 된 선택 사항을 만들고'viewDidLoad'에'assert (object! = nil)'을 추가하여보기 컨트롤러를 표시하기 전에 설정을 잊어 버리면 즉시 알 수 있습니다. – dan

+0

암시 적으로 랩핑되지 않은 옵션이 작동하지 않습니까? 시피, 컴파일 오류를 표시하는 대신 프로그램을 중단 시키지만 프로그램에 오류가 없음을 알려야합니다. – orccrusher99

+0

네, 단지'var set : ModelObject! '로 선언하십시오. – Paulw11

답변

0

var set: ModelObject!를 선언하는 것은 당신에게 비 선택적 특성을 제공 할 것입니다. 자신의 속성을 설정하는 동안. 그러나 경고하기, 당신이 그것을 설정하기 전에 속성을 사용하면 (prepareForSegue에서 설정하는 것처럼 보이지 않을 것입니다 : 프로그램이 충돌 할 것입니다!) 그래서 @dan과 같은 어설 션을 제안하면 안전하기 전에 테스트를 거쳐야합니다. 그것을 사용.

class ChildVC{ 
    var set:ModelObject! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     assert(set != nil) 

    } 

} 

것은 그럼 그냥 동일 ParentVCprepareForSegue:에 코드를 유지할 수 있습니다.

+0

감사합니다 NSGangsta! – Aaronium112

+0

@ Paulw11 prepareForSegue는'viewDidLoad() '아마도'init() '을 생각하고 있을까요? ViewController 라이프 사이클 메소드는 인스턴스 생성 후 UINavigationController 나 UIViewController가 나타날 때까지 호출되지 않고 새로운 UIViewController를 네비게이션 스택에 푸시합니다. 'prepareForSegue'는 vc가 네비게이션 스택에 푸시되기 전에 호출됩니다. 왜냐하면 종종 다른 calcul에서 암시 적으로 unwrapped 옵션을 사용하기를 원하기 때문에'viewDidLoad'를 사용합니다 viewDidLoad'의 ations. – NSGangster

+0

그리고 VC의 생명주기에서 여러 번 호출되기 때문에'viewWillAppear'에서'assert '하는 것이 효율적이지 않을 수도 있습니다. – NSGangster