2009-05-25 6 views
3

초보자로서 IB와 가능한 모든 연결이 나에게 어리 석다. 내가 찾은 대부분의 튜토리얼은 스파게티 코드의 환생이라고 부르는데, 얽힘은 드래그로 생성 된 모든 연결입니다. 물론 뷰의 레이아웃을 위해 IB를 사용하고 싶습니다. (시각적 요소를 배치하는 크기는 &입니다.) 이것이 바로 IB의 장점입니다. 그러나 컨트롤러는 뷰가 아니므로 모든 컨트롤러가 전적으로 코드이고 IB의 어느 곳에도 나타나지 않으면 혼란스럽지 않습니다. 나는 이것이 스파게티를 최소화 할 것으로 생각한다. 또한 1 회 시청 당 (one-xib-per-view) 훈계를 권장합니다. 이를 위해 여기에 질문이 있습니다.이 전략을 따르는 예제 프로젝트는 어디에서 찾을 수 있습니까?xib에서 컨트롤러를 유지하는 방법

답변

1

좋은 질문입니다. 내가 고수하려고하는 패턴은 코드에서 컨트롤러를 만들고 IBOutlets와 IBActions를 해당 코드와 상호 작용하는 XIB/NIB에 추가하고 컨트롤러의 생성자에서 "self"로 XIB/NIB를로드하는 것입니다 소유자 및 IB에서 "File 's Owner"자리 표시 자에 물건을 연결합니다.이 자리 표시 자의 ID는 내 컨트롤러의 클래스로 지정됩니다.

4

예제 프로젝트 세트가 없지만, XIB 파일이나 코드에서 컨트롤러를 작성해야하는 경우와 작동 방식에 대한 정보를 제공 할 것입니다.

사용자의 동작으로 컨트롤러를 동적으로 생성 한 경우 일반적으로 컨트롤러를 XIB 파일에서 인스턴스화하지 않습니다. 대신, 위의 해악처럼 코드에서 인스턴스를 생성 할 것입니다. 일단 그렇게하면 코드로 만든이 컨트롤러를 IB에서 만든 사용자 인터페이스 요소에 연결하는 메커니즘이 필요합니다.

IB가 해결하기 위해 제공하는 메커니즘은 파일 소유자입니다. Interface Builder를 사용하려면 파일 소유자를 마스터하는 것이 필수적입니다.

파일의 소유자가 XIB 파일의 "in"인 개체가 아니며 XIB 파일에 표시된 개체입니다. XIB 파일을로드 할 때 이미 존재할 개체의 자리 표시 자입니다. 런타임에 NIB 파일을로드하면 NSBundle 메서드가로드됩니다. [NSBundle loadNibNamed : ownwer : options :]. owner 매개 변수는 XIB/NIB 파일에서 파일의 소유자 자리 표시 자 개체를 확인하는 데 사용됩니다. 파일이 런타임에로드되면 파일 소유자에 대해 수행 된 모든 연결은 소유자 매개 변수로 전달 된 NSBundle 메서드에 대한 객체와 비교됩니다. iPhone에서는 NIB 파일을 직접로드하지 않습니다. 대신 UIViewController 그것을 않습니다.

- (void)loadView { 
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil]; 
} 

그래서, 파일의 소유자로 XIB 파일의 요소를 연결하여, 당신은 당신의 뷰 컨트롤러에 연결됩니다 : UIViewController에의에는 loadView 메소드의 디폴트의 구현은 다음과 같이 표시 될 수 있습니다.

응용 프로그램에 정적으로 존재하는 컨트롤러가 있습니다. 그들은 영원히 살아있을 것입니다. 루트 항목과 함께 탐색 또는 탭 컨트롤러는 일반적으로 응용 프로그램의 전체 수명 동안 살아 있습니다. 이 경우 MainWindow.xib 파일에 View Controller를 설정합니다. 대부분의 다른 컨트롤러는 동적으로 생성되며 사용자가 일을 처리 할 때 프로그래밍 방식으로 생성됩니다.

+0

감사합니다. 존, 도움이되는 정보입니다. 나는 여전히 IB 측에서 컨트롤러를 갖지 않는 전략을 시도하고 싶다. 그것이 할 수 있다는 것에 동의하십니까? 나는 여전히 코드 예제를 찾고있다 ... – bedouger

+0

모든 것이 가능하다. 그러나 나는 위에 열거 한 접근법을 추천 할 것이다. MainWindow.xib 파일에 정적 컨트롤러를 만들고 사용자 동작에 대한 응답으로 대부분의 (일반적으로 모두) 다른 컨트롤러를 코드에 만듭니다. –

관련 문제