テキストボックスのタップでdatetimepickerコントロールを表示するにはどうすればよいですか?
到着および出発テキストフィールドがあるユーザーインターフェイスがあり、ユーザーが到着テキストボックスをクリックすると、キーボードの代わりにdatetimepickerコントロールが表示され、出発テキストボックスと同じになります。
これには、テキストフィールドのinputView
およびinputAccessoryView
プロパティを使用できます。日付ピッカーを作成し、2つのテキストフィールドの入力ビューに設定します。また、Done
ボタン用の別のビューを作成し、それをアクセサリビューとして作成します。入力ビューを閉じるには、そのボタンが必要になります。
Done
ボタンは、基本的にこれを行う機能に接続する必要があります–
if ( [textField1 isFirstResponder] ) {
[textField1 resignFirstResponder];
} else if ( [textField2 isFirstResponder] ) {
[textField2 resignFirstResponder];
}
別のオプションは、UITextField
をサブクラス化し、inputView
およびinputAccessoryView
をオーバーライドすることです。これは、それらの負荷があるときに行く方法です。
例
@interface CustomKeyboardAppDelegate : NSObject <UIApplicationDelegate> {
...
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UIToolbar *accessoryView;
@property (nonatomic, retain) IBOutlet UIDatePicker *customInput;
- (IBAction)dateChanged:(id)sender;
- (IBAction)doneEditing:(id)sender;
@end
XIBで、UIToolbar
とUIDatePicker
を引き出しますが、ビューにアタッチしないでください。コンセントを適切に接続します。 dateChanged:
は日付ピッカーの変更に応答し、doneEditing:
は、ツールバーのDone
ボタンがクリックされると呼び出されます。それらも接続します。メソッドは以下にリストされているように実装されます。
@implementation CustomKeyboardAppDelegate
@synthesize window=_window;
@synthesize textField = _textField;
@synthesize accessoryView = _accessoryView;
@synthesize customInput = _customInput;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.textField.inputView = self.customInput;
self.textField.inputAccessoryView = self.accessoryView;
...
}
...
- (IBAction)dateChanged:(id)sender {
UIDatePicker *picker = (UIDatePicker *)sender;
self.textField.text = [NSString stringWithFormat:@"%@", picker.date];
}
- (IBAction)doneEditing:(id)sender {
[self.textField resignFirstResponder];
}
@end
最後の2つの方法は、このピッカーに依存するテキストフィールドが増えると膨張します。
ViewController.h
でUITextFieldDelegate
の後にviewDidLoad
を置いてください。
txtFecha.delegate = self;
datePicker = [[UIDatePicker alloc]init];
[datePicker setDatePickerMode:UIDatePickerModeDate];
self.txtFecha.inputView = datePicker;
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のアウトレットです
私が見つけた本当に便利なクラスがあります-ブログの投稿はこちらです: http://www.pietrorea.com/2012/07/how-to-hide-the-cursor-in-a-uitextfield/ =しかし、基本的にinputView/inputAccessoryビューも使用します。キッカーは、少なくとも私がやっていたことのために、UILabelはまさに私が必要としていたものだったということです。
textFieldをクリックして日付ピッカーを開くSwift 3.0 UITextFieldDelegateを追加し、ViewDidload()にデリゲートを設定しますtfDate.delegate = self
//MARK:- TextField Delegate
//MARK:-
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
//MARK:- DatePicker
//MARK:-
func textFieldDidBeginEditing(_ textField: UITextField) {
self.callDatePicker(textField: tfDate)
}
func callDatePicker(textField:UITextField){
let datePickerView : UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.date
textField.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(MyViewController.handleDatePicker), for: .valueChanged)
}
var str:String = ""
var str1:String = ""
var strStartDate:Date!
var strEndDate:Date!
func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy"
print("Date :: \(dateFormatter.string(from: sender.date))")
tfDate.text = dateFormatter.string(from: sender.date)
}