2009-08-12 5 views
7

간단한 퀴즈 응용 프로그램을 디자인하고 있습니다. 응용 프로그램은 다른 유형의 QuizQuestions를 표시해야합니다. QuizQuestion의 각 유형에는 고유 한 동작 및 UI가 있습니다. 내가 인터페이스 빌더에서 QuizQuestion의 각 유형을 설계 할 수 있도록하고 싶습니다 alt text http://dl.getdropbox.com/u/907284/Picture%201.pngiPhone 하위 뷰 디자인 (UIView 대 UIViewController)

:

사용자 인터페이스는 다음과 같이 될 것입니다.

예를 들어, MultipleChoiceQuizQuestion는 다음과 같이 보일 것이다 : alt text http://dl.getdropbox.com/u/907284/Picture%202.png

원래, 나는 QuizQuestion의 클래스 A의 UIViewController를 만들기 위해 계획했다. 그러나 Apple 설명서에서 UIViewController는 전체 페이지를 표시하는 데 사용해야한다고 읽었습니다.

따라서 UIViewController와 QuizQuestion 클래스 UIView의 하위 클래스 인 전체 화면 (예 : 이전/다음 버튼)을 관리하는 QuizController를 만들었습니다. 그러나

는, (IB에서 만든)이있는 UIView를로드하는 데, 나는 [1] 내 생성자에서 다음을 수행해야합니다

//MultipleQuizQuestion.m 
+(id)createInstance { 
    UIViewController *useless = [[UIViewController alloc] initWithNibName:@"MultipleQuizQuestion" bundle:nil]; 
    UIView *view = [[useless.view retain] autorelease]; 
    [useless release]; 
    return view; // probably has a memory leak or something 
} 

이러한 유형의 액세스 표준으로 또는 객체 지향하지 않는 것 같습니다. 이 유형의 코드는 정상입니까/수용 할 수 있습니까? 아니면 내 디자인 어딘가에서 잘못된 선택을 했습니까?

감사합니다, (선명도)

편집 :이 난의 ViewController 같은 multipleChoiceView을 ... 제어하는 ​​별도의 클래스를 가지고 싶습니다하지만 분명히 그 전체 창에 대해서만입니다. 아마도 MultipleChoiceViewManager (컨트롤러가 아닌)를 만들고 File Owner를 대신 설정해야할까요?

답변

5

당신은 올바른 길을 가고 있습니다. QuizController xib에서 QuizController의 기본보기보다는 xib의 기본 창으로 드래그하여 별도의보기를 만들 수 있습니다. 그런 다음 질문 유형에 따라 필요한 각보기를 디자인 할 수 있습니다. 사용자가 다음 또는 이전을 탭하면 이전보기를 제거하고보기 컨트롤러의 기본보기에서 -addSubview를 사용하여 질문 유형에 따라 필요한보기를로드하고 현재 어떤 하위보기가 표시되는지 추적하십시오. 이 같은 노력 뭔가 : 선다형 문제보기 및 openEndedView 당신이 IB에 디자인 뷰에 연결된 QuizController에 UIView의 출구이다

[currentView removeFromSuperView]; 

switch(questionType) 
{ 
    case kMultipleChoice: 
     [[self view] addSubview:multipleChoiceView]; 
     currentView = multipleChoiceView; 
     break; 
    case kOpenEnded: 
     [[self view] addSubview:openEndedView]; 
     currentView = openEndedView; 
     break; 
// etc. 
} 

. 부모보기에서 뷰의 위치를 ​​엉망으로 추가해야만 올바른 위치에 표시 될 수 있지만 UIView에서 -setBounds/-setFrame 및/또는 -setCenter를 호출하면이 작업을 수행 할 수 있습니다. .

+0

고마워요.하지만 multipleChoiceView를 제어하는 ​​별도의 클래스를 갖고 싶습니다. ViewController와 비슷하지만, 전체 윈도우에서만 가능합니다. 아마도 MultipleChoiceViewManager (컨트롤러가 아님)를 만들어 File Owner를 대신 설정해야합니까? – tba

+0

나는 당신이 그렇게하는 것을 더 어렵게 만들고 있다고 생각한다. 위임은 관계없이 사용해야하는 것이므로 자신의 클래스 또는 코드가 사용되는 뷰 컨트롤러 클래스에서 코드를 원하는 위치와 관련하여 결정해야합니다. 분명히 당신에게 달렸지 만, 나는 당신이 그것을 자신의 반에 넣어서 얻는다고 생각하지 않습니다. 친애하는. –

0

네, 아이폰의 IB는 File 's Owner가 UIViewController 서브 클래스가되기를 바라고 있습니다. 그래서 당신은 조금 까다로울 수 있습니다. 펜촉을로드 할 런타임의 원인이됩니다

@implementation QuizController 

- (void) loadCustomViewFromNib:(NSString *)viewNibName { 
    (void)[[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil]; 
} 

@end 

아니라 새로운 뷰 컨트롤러를 만드는 것보다 작업을 연결하고 : 당신이 할 수있는 펜촉을 사용하여 하나의 인스턴스 대신 기존의 UIViewController에 대한 펜촉을로드입니다 아울렛은 당신이 주인이 될 때 사용할 것입니다. 펜촉에 정의 된 뷰에서 자기를 전달하기 때문에 호출 후 할당 된 IBOutlet에 부착됩니다.

+0

고마워요 유용한 스 니펫 – tba

관련 문제