web-dev-qa-db-ja.com

テキストフィールドタップで日付ピッカーを表示する

私はiOSに非常に新しいので、明らかにこの解決策に従うことを試みるときにいくつかの概念が欠けています テキストフィールドをタップするときに日付ピッカーを表示する 私の問題に。

DatepickerAppDelegateと呼ばれるクラスにインターフェイスと実装がありますが、ここでは失われました。

」XIBで、UIToolbarとUIDatePickerを引き出しますが、ビューにアタッチしません。アウトレットを適切に接続します。dateChanged:日付ピッカーとdoneEditing:の変更に応答します:が呼び出されますツールバーの[完了]ボタンがクリックされたとき。それらも接続します。メソッドは次のように実装されます。 "

私はXIBについて何かを読みましたが、絵コンテを使用しているので、そうではないと思います。また、View Controllerにアタッチせずに要素を引き出す方法がわからない(試していますが、マウスボタンを離すと、ツールがツールバーに戻ります) tにUIToolbarが必要な理由さえ理解できません。

最後に、テキストフィールドをdatepickerデリゲートに接続するにはどうすればよいですか?

誰か助けてくれますか?

更新:

実際、それは非常に単純で、必要なことは次のとおりです。

datePicker = [[UIDatePicker alloc] init];
datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

self.birthday.inputView = datePicker;
21
lolol

UIResponderは、UITextFieldの継承元です。 inputViewというプロパティを定義します 。このプロパティ(UIView *)は、UIResponderが最初のレスポンダーになったときに表示されるビューを定義できますキーボードの代わりに

したがって、textFieldをタップしたときにUIDatePickerを表示する場合(つまり、そのtextFieldを最初のレスポンダーにする場合)、単純に言うことができます。

UIDatePicker *datePicker = [[UIDatePicker alloc] init...];
... configure datePicker ...

[myTextField setInputView:datePicker];

これで、UITextFieldがタップされると、代わりにUIDatePickerが表示されます。

しかしながら

さまざまな向きとイディオムを処理する必要があるため、これ以上のことを行う必要があります。

しかし、それが基本的な考え方です。

(そして、UIDatePickerの上にツールバーが必要な場合、それはinputAccessoryViewプロパティの目的です...)

52
Dave DeLong

ViewDidLoadのViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

    UIDatePicker *datePicker = [[UIDatePicker alloc]init];
    [datePicker setDate:[NSDate date]];
    datePicker.datePickerMode = UIDatePickerModeDate;
    [datePicker addTarget:self action:@selector(dateTextField:) forControlEvents:UIControlEventValueChanged];
    [txtFieldBranchYear setInputView:datePicker];
}

ViewControllerにメソッドを1つ追加します

-(void) dateTextField:(id)sender
{
    UIDatePicker *picker = (UIDatePicker*)txtFieldBranchYear.inputView;
    [picker setMaximumDate:[NSDate date]];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    NSDate *eventDate = picker.date;
    [dateFormat setDateFormat:@"dd/MM/yyyy"];

    NSString *dateString = [dateFormat stringFromDate:eventDate];
    txtFieldBranchYear.text = [NSString stringWithFormat:@"%@",dateString];
}

txtFieldBranchYearはUITextFieldのアウトレットです

21
iAnkit

ビューにdatepickerビューとuitoolbarviewを追加します。例えば

CGFloat toolbarHeight = 44.f;
CGFloat datePickerHeight = 140.f;
CGFloat containerViewHeight = toolbarHeight+datePickerHeight;
//create container view for datepicker and toolbar
UIView *containerView = [[UIVIew alloc] initWithFrame:CGRectMake(0.f, [self.view bounds].size.height+containerViewHeight, [self.view bounds].size.width, containerViewHeight)];

//after init toolbar set the frame
toolBar.frame = CGRectMake(0.f,0.f,containerView.frame.size.width, toolbarHeight];
//then add on toolbar button save and release it after add

//after init datePicker set the frame
datePicker.frame = CGRectMake(0.f, toolbarHeight, containerView.frame.size.width, datePickerHeight);

//add datePicker and toolBar to containerView
[containerView addSubview: toolBar];
[containerView addSubview: datePicker];

[toolBar release];
[datePicker release];

//add containerView to main view

[self.view addSubview: containerView];
[containerView release];

したがって、ビューがロードされたとき、それらは非表示になります。コンテナビューのYは、ビューフレームの外側にあります。

ここで、UITextFieldDelegateのプロパティデリゲートを割り当てる必要があります

textfield.delegate = self;

デリゲートのメソッドtextFieldDidBeginEditingを参照 ITextFieldDelegate datePickerとツールバーを表示するメソッドを起動する必要があります。選択されたものを定義する多くのtextFieldsがある場合、整数であるtagプロパティを使用し、多くの代わりにswitchを使用できますif条件。

DatePickerとツールバーを表示するには、containerViewフレームのYを変更する必要があります。方法は次のとおりです

CGRect containerViewFrame = containerView.frame;
containerViewFrame.y -=containerViewHeight;
containerView.frame = containerViewFrame;

ContainerViewHeight変数だけを非表示にします。 UIViewAnimationsを使用して、いくつかのアニメーションで表示できます。たとえばUIViewAnimationCurveEaseInOut

0
artyom