1

アプリのいくつかの場所で datePicker を使用します。UIPickerViewDelegate と UIPickerDatasource の委譲メソッドを使用して、すべての viewController を「乱雑」にしたくありません。さらに、同じ委譲メソッドを何度も繰り返します。

datePicker が実行されるたびに、唯一の目的は画面の途中までスライドし、ユーザーに日付を選択させてから再び非表示にすることです。datePicker デリゲート メソッドを実装するラッパー viewController (DatePickerViewController) を考えていたのですが、ユーザーが選択した値で NSNotification を実行しました。これにより、私は分離されたdatePickerになり、datePickerをインスタンス化するviewControllerはDatePickerDelegateについて何も知らず、NSDateを含む通知が来る可能性があることだけを知ることができます. 他の言語でやるように、私には合理的に思えます。しかし、私がここに穴を掘っている場合は、私を修正してください:)

これを分解し始めたとき、Objective C と Cocoa の経験があまりないので、いくつかの困難に遭遇しました。viewDidLoad で datePicker を表示する viewController を作成できます。これを実行すると、画面の下半分に datePicker が表示された空白の画面が表示されます。(カスタム)DatePickerViewControllerをインスタンス化するviewControllerから「presentModalViewController」を使用すると、もちろん上にスライドして画面全体をカバーします。ユーザーがビューの半分を表示したままにしたいと思います。iCal アプリでイベントの時間を設定するのとよく似ています。(ただし、新しいviewControllerをスタックにプッシュします)。ああ、私が言いたいことは、スライドして画面の半分を覆うキーボードとまったく同じであることに気付きました.

だから私の主な問題は、ビューに追加されたときにキーボードのように動作するviewControllerを構築できるかということだと思います。ただし、これはすべて、ビューをインスタンス化するコントローラーではなく、追加された ViewController で行います。

それが理にかなっていることを願っています:)

ありがとうございました

4

1 に答える 1

1

(1) ピッカーをモ​​デル (編集: モーダルにする必要があります) ビューに配置します。これがキーボードの実装方法です。

(2) ピッカー コントローラー/デリゲートは、モデル ビューとピッカーのみを制御する必要があります。

(3) デリゲートで、次のような 2 つのプロパティを作成します。

id *ターゲット; セレクター

そして次のような方法:

-(void) sendPickerResultsTo:(id) theTarget forSelector:(SEl) theSelector;

(4) ピッカー モデル ビューを表示する前に、ターゲットを呼び出し側コントローラーに設定し、theSelector を呼び出し側コントローラーのメソッドに設定します。任意の量のデータを渡すようにセレクター メソッドを構成できます。次のようになります。

-(void) pickerResults:(NSArray *) pickerResults; // オブジェクトである限り、任意の値を渡すことができます

[注: これは、頻繁に使用する場合にプロトコルを定義するようなものです]

(5) ピッカーの値がある場合は、ピッカー デリゲートを呼び出すだけです。

[self.target performSelector:theSelector withObject:anArrayOfPickerResults];

(5) モデル ピッカー ビューを呼び出す必要がある任意のコントローラーに適切なメソッドを追加し、モデル ピッカー ビューを表示する前にコントローラーをターゲットとして設定します。

これにより、自己完結型のモデル ピッカー ビューが提供されます。このモデル ピッカー ビューは、任意のビューにアタッチでき、その結果を、適切なシグネチャを持つメソッドを実装する任意のオブジェクト、つまりプロトコルを実装する任意のオブジェクトに送信できます。

これは基本的に、UIControls addTarget:action:forControlEvents の自分で行うバージョンです。

于 2009-11-10T18:05:12.793 に答える