2009-08-13 5 views
1

私はiPhoneアプリを開発しています。別の質問ビューが埋め込まれたクイズアプリケーションを作成する必要があります(similar question参照)。Cocoa Touchでのサブビューの管理

質問の種類が異なるため、質問の種類ごとにコントローラクラスを作成する予定です。 MultipleChoiceQuestionControllerは、ユーザーが回答を選択するための質問と3-4のボタンを設定します。同様に、IdentifyPictureQuestionControllerはイメージをロードし、テキストボックスをユーザーに提示します。

ただし、docsは、UIViewControllerは、アプリケーションウィンドウ全体を占めるビューに対してのみ使用する必要があると言います。サブビュー内のイベントを管理するためのクラスを他にどのように作成できますか?

おかげで、

答えて

1

あなたはビュー自体のイベントを処理することができ、またはあなたのビューコントローラが変更委譲クラスを持つことができますさまざまなタイプの質問に対してその代理人は異なる入力を処理し、ユーザーの接触とは異なる方法で反応します。

ここにいくつかのコードがあります。

// In QuestionViewControllerDelegateProtocol.h 
@protocol QuestionViewControllerDelegateProtocol 

// Define the methods you want here 
- (void)touchesBegan; 
- (void)touchesEnded; 
- (void)questionLoaded; 

@end 

// In QuestionViewController.h 
@interface QuestionViewController { 
    id<QuestionViewControllerDelegateProtocol> delegate; 
} 

@end 

// In QuestionViewController.m 
@implementation QuestionViewController 

- (void)viewDidLoad:(BOOL)animated { 
    [delegate questionLoaded]; 
} 

- (void)touchesBegan { 
    // Some processing logic. 
    [delegate touchesBegan]; 
} 

@end 
+0

Apple docsは私に教えてくれません。それでは、viewDidLoad:fireのようなメソッドを作るにはどうすればいいですか? – tba

+0

私はApp Delegateについてここでは話しません。私はあなたの 'UIViewController'の作業の一部であるカスタムデリゲートクラスについて話しています。これは、選択されたビュー(質問の種類)に基づいてその代理人を交換することができるので – pgb

+0

ありがとうございます。ですから、私はloadNibNamedを使うことを考えています:@ "MySubview" owner:myCustomDelgate。サブビューがロードされたときにmyCustomDelegateに通知されますか? – tba

1

サブクラスのUIViewControllerは、この機能を提供します。たとえば、MultipleChoiceQuestionControllerはUIViewControllerのサブクラスです。 MultipleChoiceQuestionControllerには質問テキスト(UILabelまたはUITextView)といくつかのボタン(UIButton)が含まれます。関連する質問文字列とその他の関連情報を表示するカスタムコンストラクタをMultipleChoiceQuestionControllerに作成することができます。

あなたのメインビューのサブビューにMultipleChoiceQuestionControllerのビューを追加したい場合は、単に次のようにします。

[myMainView addSubview:instanceOfMultipleChoiceQuestionController.view]; 
+0

Appleは述べていないように:「注:あなたは自分のウィンドウ、アプリケーションコンテンツの長方形で定義された領域の一部のみであるの一部のみを埋めるビューを管理するビューコントローラを使用しないでください複数の小さなビューで構成されたインターフェイスを使用する場合は、それらをすべて単一のルートビューに埋め込み、ビューコントローラでそのビューを管理してください。 (http://developer.apple.com/iphone/library/documentation/デリゲートクラスにUIViewController、buを継承させるのは理にかなっているでしょう。UIViewController、bu(UIKit/Reference/UIViewController_Class/Reference/Reference.html#// apple_ref/doc/uid/TP40006926-CH3-DontLinkElementID_1) – tba

1

私は同じ問題を抱えている、とAppleのドキュメントによると、ここにあなたが何をすべきかです:

注:それぞれを複数の領域に単一 画面を分割して を管理したい場合個別の コントローラーオブジェクト(カスタムオブジェクト NSObjectから降順)を使用して、 コントローラオブジェクトを表示して、各画面の サブセクションを管理します。次に、 単一ビューコントローラオブジェクトを使用して、 汎用コントローラオブジェクトを管理します。 ビューコントローラは、画面全体の操作である を調整しますが、 は、管理する汎用コントローラオブジェクト に必要に応じてメッセージを転送します。

http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html#//apple_ref/doc/uid/TP40007457-CH112-SW12

0

これは、とても素敵な小さなソリューションであるリンゴのルールを壊すことなく、あなたのビューコントローラの利点のすべてを提供します。ページから

これは、サブエリアを処理するために使用することができる汎用コントローラクラス です。 UIViewController、 の後にモデル化されていますが、Appleの 推奨に準拠しています。

あなたのビューコントローラは インスタンスを作成し、サブビューコントローラを管理するのは です。 さらに、 はビューhierachyを細分化し、 サブビューコントローラを 他のサブビューコントローラ内に作成することもできます。 の場合、 オブジェクトをインスタンス化するコントローラは、 サブビューコントローラの管理を担当します。責任のあるコントローラ は、「親 コントローラ」と呼ばれます。サブクラスは ビューコントローラを使用できます。たとえば、 はモーダルダイアログを表示する必要があります。

https://github.com/Koolistov/Subview-Controller

関連する問題