2012-03-18 3 views
50

viewController 내 스토리 보드로 설계된 CustomViewController의 초기화 메소드를 재정의하는 데 문제가있는 경우, 스토리 보드가있는 사용자 정의 init 메소드

지금 (내 mainViewController에서)하고 인스턴트 메신저 :

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

와 나는

[self.label setText:self.myObject.someString]; 

이 작품을 좋아있는 viewDidLoad (CustomViewController)에 있습니다.

하지만 올바른 방법입니까? 내 CustomViewController에 사용자 정의 init 메소드를 추가 (또는 재 지정)해야합니까? initWithObject와 마찬가지로 :? 나는 UIStoryboard instantiateViewControllerWithIdentifier: 대신 내 사용자 정의 init 메소드를 호출하는 방법을 모르며 init이나 initWithNibName으로 전화를받지 못하고있다.

아마도 : - (id)initWithCoder:(NSCoder *)decoder을 사용해야합니다.

제게 조언 해주세요.

감사합니다.

+0

required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) //invoke your data source here } 

알아요 ... 나는 또한이하지만 ... 싫어 모든 게 맞아. 사용자 정의 클래스에서 initWithCoder를 오버라이드 할 수 있습니다. 즉, 사용자 정의 init을 수행하기위한 _customViewController 객체의 클래스 파일 –

답변

58

스토리 보드의보기 컨트롤러에 대해 지정된 초기화 프로그램은 -initWithCoder:입니다. 스토리 보드의 대부분의보기 컨트롤러는 연속보기를 통해 만들어 지므로 대개 -prepareForSegue:sender: 동안 설정된 상태가 표시됩니다.

제공 한 예와 같이 스토리 보드에서 직접보기 컨트롤러를 인스턴스화하는 경우 선택한 패턴이 적절합니다.

+0

im은 예상대로 일을 수행하는 것을 알 수 있습니다! –

+2

개발자가 올바른 변수를 설정하는 것을 잊어 버렸을 경우, 신속하게 Optionals를 사용하여 (!?) 사용하거나 가능한 nils에 액세스 할 수있게하기 때문에 꽤 나쁜 디자인입니다. 이것이 "적절한"해결책이라는 것은 슬픈 일입니다. 신속한/객관적인 선택 사항 인이 문제에 대한 좋은 출처 : http://www.objc.io/issue-16/power-of-swift.html –

+0

응답하기 만하면됩니다. @GuilhermeSilveira의 의견에 따르면,이 질문은 2012 년에 나온 것으로, 신속하게 대중에게 알려지지 않았고, 심지어 그렇다고해도 Objective-C와 Swift의 디자인 패턴이 다른 방식이므로 개발중인 경우이 패턴을 고집하지 않아야합니다. 빠른. –

0

이 문제에 대한 다른 "대안"으로 위임을 사용할 수 있습니다. 스토리 보드에서 UIViewController 하위 클래스의 데이터 소스 역할을하는 프로토콜을 만듭니다. 이 데이터 소스 프로토콜을 준수를 구현하고 바로 UIViewController 하위를로드 한 후 그것을 사용, 당신이하고있는)