2

8 つのテキスト フィールド エントリと 4 つの日付フィールド エントリを含むデータ入力フォーム (スクロール可能なビュー) を考えると、テキストに応じて、通常 (キーボードがどのようにポップアップするか) の下部に日付ピッカーを表示することは可能ですか?ユーザーがタップしたフィールド?

日付ピッカーをコードでモーダルに表示できると思いますが、キーボードが呼び出されて表示されるのと同じ方法で日付ピッカーを表示すると、SDKに組み込まれているようですが、何か不足していますか? (nib エディターで属性を設定して、このテキスト フィールドが日付を受け入れることをビューに伝え、さまざまなキーボードに加えて日付ピッカー オプションを提供します)

宣言された日付フィールドがフォーカスを取得したときに、開発者がカレンダーまたは日付ピッカーを「ポップアップ」する簡単な方法を持っていないのは、私には驚きです。

あなたが知っているアプリやチュートリアルの例はありますか?

4

1 に答える 1

8

私はちょうどこの同じ質問を調査しました.Webにはサードパーティのライブラリとトリッキーなハックがたくさんありますが、実際には、あなたが求めていることを達成するための非常に単純で、おそらく好ましい方法があります.

まず、UITextField inputViewおよびinput accessoryViewプロパティによって提供される機能を活用し、これらを組み合わせて無限のカスタマイズの可能性を提供します。私にとっての問題は、自分が望むものを正確に得るために物事を構造化する方法を知ることでした. ここでそれらについて読むことをお勧めします:

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html

そのため、次の 2 つのプロパティを宣言することから始めました。

@property (nonatomic, strong) UIDatePicker *datePicker;
@property (nonatomic, strong) UIView *datePickerToolbar;

次に、次のようなものでそれぞれを作成しました。

- (UIView*)datePickerToolbar {

    if (!_datePickerToolbar) {

        UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
        toolbar.barStyle = UIBarStyleBlack;

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(datePickerCanceled:)];
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(datePickerDone:)];
        UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        [toolbar setItems:[NSArray arrayWithObjects:cancelButton, space, doneButton, nil] animated:NO];

        _datePickerToolbar = toolbar;
    }
    return _datePickerToolbar;
}

- (UIDatePicker*)datePicker {

    if (!_datePicker) {

        UIDatePicker *datePicker = [[UIDatePicker alloc] init];
        datePicker.datePickerMode = UIDatePickerModeDate;

        datePicker.date = [NSDate date];

       _datePicker = datePicker;
    }
    return _datePicker;
}

もちろん、ニーズに合わせてこれらのビューをカスタマイズできます。ただし、これらのビューは独自のものであるため、ツールバーの各ボタンが相互作用を処理する方法も決定する必要があります。どちらも「キーボード」を閉じる必要がありますが (これはファーストレスポンダーを辞任することによって行われます)、私の場合は、[完了] ボタンで日付入力フィールドを選択した日付の書式設定された文字列に設定することも必要でした:

- (void)datePickerCanceled:(id)sender {
    // just resign focus and dismiss date picker
    [self.dateOfBirthField resignFirstResponder];
}


- (void)datePickerDone:(id)sender {

    NSDate *selectedDate = self.datePicker.date;

    // format date into string
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

     // format overall string
    NSString *dateString = [dateFormatter stringFromDate:selectedDate];
    self.dateInputField.text = dateString;

    [self.dateOfBirthField resignFirstResponder];
}

その後、キーボードの置き換えをトリガーするために残された唯一のことは、カスタム ビューをUITextField前述のプロパティ プロパティに割り当てることです。

- (void)viewDidLoad {
    [super viewDidLoad];

    self.dateInputField.inputView = self.datePicker;
    self.dateInputField.inputAccessoryView = self.datePickerToolbar;
}

これがあなたが探していたものであることを願っています。そこにあるすべてを見た後、これが最も簡単で、最も管理しやすい方法であると確信しています。また、このアプローチは、さまざまな入力要件に合わせて簡単に変更および再利用できるため、気に入っています。

私の意見では、隠された宝石。

于 2014-08-02T22:47:00.150 に答える