2009-08-12 8 views
7

私は単純なクイズアプリケーションを設計しています。アプリケーションは、さまざまなタイプのQuizQuestionsを表示する必要があります。 QuizQuestionの各タイプには、異なる動作とUIがあります。私は、Interface Builderで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クラスの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(コントローラではない!)を作成し、その代わりにファイルの所有者を設定する必要がありますか?

答えて

5

あなたは正しい道を歩いています。あなたのQuizController xibでは、QuizControllerのメインビューではなくxibのメインウィンドウにドラッグすることで別々のビューを作成できます。次に、質問タイプごとに必要な各ビューをデザインすることができます。ユーザーが次または前にタップすると、以前のビューを削除し、ビューコントローラのメインビューで-addSubviewを使用して質問タイプに基づいて必要なビューをロードし、現在表示されているサブビューを追跡します。

[currentView removeFromSuperView]; 

switch(questionType) 
{ 
    case kMultipleChoice: 
     [[self view] addSubview:multipleChoiceView]; 
     currentView = multipleChoiceView; 
     break; 
    case kOpenEnded: 
     [[self view] addSubview:openEndedView]; 
     currentView = openEndedView; 
     break; 
// etc. 
} 
多肢選択法のビューとopenEndedViewあなたはIBに設計されたビューに接続し、あなたのQuizControllerでのUIView店です

:このような何かをしようとしています。適切な場所に表示するために追加する前に、親ビュー内のビューの位置を混乱させる必要があるかもしれませんが、UIViewの-setBounds/-setFrameおよび/または-setCenterの呼び出しでこれを行うことができます。

+0

ありがとうございますが、私はmultipleChoiceViewを制御する別のクラスを持っていたいと思います... ViewControllerのように、それは明らかにそれは全ウィンドウに対してのみです。 多分私はMultipleChoiceViewManager(コントローラではない!)を作成し、その代わりにFile's Ownerを設定する必要がありますか? – tba

+0

あなたはあなたがそれをやっていることをより困難にしていると思います。委任は、関係なく使用しなければならないものなので、自分のクラスを使用する場所、または使用するビューコントローラクラスでコードをどこに配置するかを決定する必要があります。それはあなた次第ですが、自分のクラスに入れて何かを得ることはないと思います。宜しくお願いします。 –

0

ええ、iPhoneのIBは本当にFile's OwnerをUIViewControllerのサブクラスにしたいと思っています。これはあなたが少しトリッキーにしたいものにします。ペン先をロードするためのランタイムが発生します

@implementation QuizController 

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

@end 

のではなく、新しいビューコントローラを作成するよりもアクションを接続すると:何ができることはペン先を使って1をインスタンス化するのではなく、既存のUIViewControllerに対するペン先をロードしていますあなたが所有者として渡すものを使用します。呼び出した後に割り当てられているIBOutletには、ペン先で定義されたビュー内で自己を渡すので、

+0

ありがとう便利なスニペット – tba

関連する問題