私はこのスレッドをたどった: テキストフィールドをクリックして日付ピッカー
次の両方のプロトコルをインポートしました。
@interface ViewController : UIViewController<UIActionSheetDelegate, UITextFieldDelegate> {
次に、実装では次を使用します。
- (void)viewDidLoad {
textField.delegate = self;
[super viewDidLoad] }
最後に、日付ピッカーを表示するための実際のコードを(スレッドから)入れます。また、すべてをIBでリンクしました。
//Date Picker
- (void)textFieldDidBeginEditing:(UITextField *)aTextField{
[aTextField resignFirstResponder];
pickerViewPopup = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 44, 0, 0)];
pickerView.datePickerMode = UIDatePickerModeDate;
pickerView.hidden = NO;
pickerView.date = [NSDate date];
UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)];
[barItems addObject:doneBtn];
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)];
[barItems addObject:cancelBtn];
[pickerToolbar setItems:barItems animated:YES];
[pickerViewPopup addSubview:pickerToolbar];
[pickerViewPopup addSubview:pickerView];
[pickerViewPopup showInView:self.view];
[pickerViewPopup setBounds:CGRectMake(0,0,320, 464)];
}
-(void)doneButtonPressed:(id)sender{
//Do something here here with the value selected using [pickerView date] to get that value
[pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES];
}
-(void)cancelButtonPressed:(id)sender{
[pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES];
}
ただし、UITextFieldをクリックすると、次のようになります。
何が間違っていますか?
UITextField
入力ビュープロパティを使用できます。コードで通常のUIDatePicker
を初期化し、それをテキストフィールドのinputViewに割り当てるだけです。これを行うと、キーボードの代わりにUIPickerView
が表示されます。コードが必要な場合はお気軽に:)
編集:コード
最初にtextField
をIBに接続します
@interface myViewController <UITextFieldDelegate>
@property (nonatomic,weak) IBOutlet UITextField *myTextField;
@end
実装において
UIDatePicker *datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];
[self.myTextField setInputView:datePicker];
UIDatePicker
をタップすると、textField
が表示されます。 datePickerに追加したアクションに注意してください。
[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];
ユーザーがピッカーをスクロールするたびにtextFieldを更新するには、updateTextField
のどこかにviewController
メソッドを実装するだけです。
-(void)updateTextField:(id)sender
{
UIDatePicker *picker = (UIDatePicker*)self.myTextField.inputView;
self.myTextField.text = [NSString stringWithFormat:@"%@",picker.date];
}
この最後の方法では、ユーザーがピッカーを回転させるたびに、テキストフィールドが更新されます!
NSDateFormatter
を使用して、文字列の出力を改善できます。以下は、日付ピッカーの表示方法です。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
self.activeTextField = textField;
// Create a date picker for the date field.
UIDatePicker *datePicker = [[UIDatePicker alloc]init];
datePicker.datePickerMode = UIDatePickerModeDate;
datePicker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:-31536000];
[datePicker setDate:[NSDate date]];
[datePicker addTarget:self action:@selector(updateDateField:) forControlEvents:UIControlEventValueChanged];
// If the date field has focus, display a date picker instead of keyboard.
// Set the text to the date currently displayed by the picker.
if (textField.tag == 1)
{
self.date.inputView = datePicker;
self.date.text = [self formatDate:datePicker.date];
}
}
// Called when the date picker changes.
- (void)updateDateField:(id)sender
{
UIDatePicker *picker = (UIDatePicker*)self.date.inputView;
self.date.text = [self formatDate:picker.date];
}
// Formats the date chosen with the date picker.
- (NSString *)formatDate:(NSDate *)date
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setDateFormat:@"MM'/'dd'/'yyyy"];
NSString *formattedDate = [dateFormatter stringFromDate:date];
return formattedDate;
}
@JRoソリューションは素晴らしい作品です!
Swift 3:
func textFieldDidBeginEditing(_ textField: UITextField) {
self.activeTextField = textField
// Create a date picker for the date field.
let picker = UIDatePicker()
picker.datePickerMode = .date
picker.addTarget(self, action: #selector(updateDateField(sender:)), for: .valueChanged)
// If the date field has focus, display a date picker instead of keyboard.
// Set the text to the date currently displayed by the picker.
textField.inputView = picker
textField.text = formatDateForDisplay(date: picker.date)
}
// Called when the date picker changes.
func updateDateField(sender: UIDatePicker) {
activeTextField?.text = formatDateForDisplay(date: sender.date)
}
// Formats the date chosen with the date picker.
fileprivate func formatDateForDisplay(date: Date) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "dd MMM yyyy"
return formatter.string(from: date)
}
.hファイルでこのプロセスを実行して、UIDatePickerのオブジェクトを作成してください
UIDatePicker *datePicker;
.mファイルのviewDidloadMethod
datePicker = [[UIDatePicker alloc]init];
datePicker.datePickerMode = UIDatePickerModeDate;
datePicker.minimumDate = [NSDate date];
[_dateTxtFld setInputView:datePicker];
UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
[toolBar setTintColor:[UIColor grayColor]];
UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(showSelectedDate)];
UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[toolBar setItems:[NSArray arrayWithObjects:space,doneBtn, nil]];
[_dateTxtFld setInputAccessoryView:toolBar];
その後、ShowSeleを作成できます
-(void)showSelectedDate {
if ([_dateTxtFld isFirstResponder]) {
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"YYYY-MM-dd"];
_dateTxtFld.text=[NSString stringWithFormat:@"%@",[formatter stringFromDate:datePicker.date]];
[_dateTxtFld resignFirstResponder];
}
else if ([_timeTxtFld isFirstResponder]) {
}
}
それは私のために働いています。
Swift 4:
let datePicker = UIDatePicker()
@IBOutlet weak var myTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
setDatePicker()
}
func setDatePicker() {
//Format Date
datePicker.datePickerMode = .date
//ToolBar
let toolbar = UIToolbar();
toolbar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneDatePicker));
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
myTextField.inputAccessoryView = toolbar
myTextField.inputView = datePicker
}
@objc func doneDatePicker(){
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy"
myTextField.text = formatter.string(from: datePicker.date)
self.view.endEditing(true)
}
@objc func cancelDatePicker(){
self.view.endEditing(true)
}
ナイスなアプローチは、TextFieldFormDate
から派生し、必要なすべての動作をカプセル化する独自のクラス(私はUITextField
と呼びます)を作成することです。ストーリーボードで、テキストフィールドのクラスをTextFieldFormDate
に設定します(私の場合)。
ViewControllerでdidChange
およびdidSelect
を使用して(TextFieldFormDate
を使用)、変更が通知され、実際に日付が選択されるタイミングを通知します。
class TextFieldFormDate: UITextField {
var date : Date {
set {
picker.date = newValue
text = newValue.localizedDateOnly()
}
get {
return picker.date
}
}
//public handlers
var didChange : ( (Date)->() )?
var didSelect : ( (Date)->() )?
private var picker : UIDatePicker {
return inputView as! UIDatePicker
}
override func awakeFromNib() {
super.awakeFromNib()
setup()
}
private func setup() {
font = UIFont.defaultFont()
//picker for datefield
inputView = UIDatePicker(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
picker.datePickerMode = .date
picker.addTarget(self, action: #selector(pickerChanged), for: .valueChanged)
let toolBar = UIToolbar()
toolBar.tintColor = PaintCode.mainBlue
toolBar.items = [
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
BarBtnPaintCode(type: "done", target: self, action: #selector(didPressDone))
]
toolBar.sizeToFit()
inputAccessoryView = toolBar
}
@objc private func pickerChanged() {
text = date.localizedDateOnly()
didChange?(picker.date)
}
@objc private func didPressDone() {
text = date.localizedDateOnly()
resignFirstResponder()
didSelect?(picker.date)
}
}
Swift 4.2
UITextField Extensionを使用して1行のコードを記述するだけで、これを実現できます。
クレジット: http://www.swiftdevcenter.com/
import UIKit
extension UITextField {
func setInputViewDatePicker(target: Any, selector: Selector) {
// Create a UIDatePicker object and assign to inputView
let screenWidth = UIScreen.main.bounds.width
let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))//1
datePicker.datePickerMode = .date //2
self.inputView = datePicker //3
// Create a toolbar and assign it to inputAccessoryView
let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0)) //4
let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) //5
let cancel = UIBarButtonItem(title: "Cancel", style: .plain, target: nil, action: #selector(tapCancel)) // 6
let barButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector) //7
toolBar.setItems([cancel, flexible, barButton], animated: false) //8
self.inputAccessoryView = toolBar //9
}
@objc func tapCancel() {
self.resignFirstResponder()
}
}
UIViewControllerクラスに以下のコードを記述します。
class ViewController: UIViewController {
@IBOutlet weak var myTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.myTextField.setInputViewDatePicker(target: self, selector: #selector(tapDone(sender:datePicker1:))) //1
}
//2
@objc func tapDone(sender: Any, datePicker1: UIDatePicker) {
print(datePicker1)
if let datePicker = self.myTextField.inputView as? UIDatePicker { // 2.1
let dateformatter = DateFormatter() // 2.2
dateformatter.dateStyle = .medium // 2.3
self.myTextField.text = dateformatter.string(from: datePicker.date) //2.4
}
self.myTextField.resignFirstResponder() // 2.5
}
}
詳細については、次をご覧ください。 http://www.swiftdevcenter.com/uidatepicker-as-input-view-to-uitextfield-Swift/