【问题标题】:UIDatePicker with "done" button带有“完成”按钮的 UIDatePicker
【发布时间】:2015-01-18 23:40:47
【问题描述】:

我需要在我的日期选择器中添加一个“完成”按钮,如下图所示:

这是我的代码:

-(IBAction)chooseDate:(id)sender{
self.datepicker= [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 216)];
    self.datepicker.datePickerMode = UIDatePickerModeDate;
    datepicker.backgroundColor = Rgb2UIColor(52, 170, 220);

    [self.btnDone
                addTarget:self
                action:@selector(SetDatePickerTime:)
                forControlEvents:UIControlEventTouchDown];

 [self.view addSubview:self.datepicker];
}

【问题讨论】:

  • 你想做什么?你有什么问题?
  • 创建一个 UIView 并将其添加到主视图。将 UIDatePicker 添加到新的 UIView。向 UIView 添加两个 UIButton。

标签: ios objective-c xcode button datepicker


【解决方案1】:

使用斯威夫特

// Place this code inside your ViewController or where you want ;)

var txtField: UITextField = UITextField(frame: CGRectMake(0, 0, 200, 50))

// the formatter should be "compliant" to the UIDatePickerMode selected below
var dateFormatter: NSDateFormatter {
    let formatter = NSDateFormatter()
    // customize the locale for the formatter if you want
    //formatter.locale = NSLocale(localeIdentifier: "it_IT")
    formatter.dateFormat = "dd/MM/yyyy"
    return formatter
}

override func viewDidLoad() {
    super.viewDidLoad()

    // date picker setup
    let datePickerView:UIDatePicker = UIDatePicker()

    // choose the mode you want
    // other options are: DateAndTime, Time, CountDownTimer
    datePickerView.datePickerMode = UIDatePickerMode.Date

    // choose your locale or leave the default (system)
    //datePickerView.locale = NSLocale.init(localeIdentifier: "it_IT")

    datePickerView.addTarget(self, action: "onDatePickerValueChanged:", forControlEvents: UIControlEvents.ValueChanged)
    txtField.inputView = datePickerView

    // datepicker toolbar setup
    let toolBar = UIToolbar()
    toolBar.barStyle = UIBarStyle.Default
    toolBar.translucent = true
    let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "doneDatePickerPressed")

    // if you remove the space element, the "done" button will be left aligned
    // you can add more items if you want
    toolBar.setItems([space, doneButton], animated: false)
    toolBar.userInteractionEnabled = true
    toolBar.sizeToFit()

    txtField.inputAccessoryView = toolBar

    self.view.addSubview(txtField)
}

func doneDatePickerPressed(){
    self.view.endEditing(true)
}

func onDatePickerValueChanged(datePicker: UIDatePicker) {
    self.txtField = dateFormatter.stringFromDate(datePicker.date)
}

【讨论】:

    【解决方案2】:

    创建一个日期选择器,然后将其添加为相关字段的输入视图 (self.fieldInQuestion.inputView = datePicker)。接下来,创建一个 UIToolBar(高度 44),上面有 UIBarButton 项目,标题为“完成”,自我目标和一个选择器(例如 @selector(done))。将此添加为您将日期选择器设置为 (self.fieldInQuestion.inputAccessoryView = UIToolbarInstance) 的输入视图的同一字段的输入附件视图。在选择器方法(上例中的-(void)done)中,确保使用 [self.fieldInQuestion resignFirstResponder] 并且它会关闭它。

    【讨论】:

    • 当我尝试将我的 uitoolbar 分配给它时,我得到 inputAccessoryView 是一个只读属性
    • @user1709076 使用[fieldInQuestion setInputAccessoryView: toolbar]
    【解决方案3】:

    您的问题的参考图像显示该应用程序正在使用 UIToolbar,我会假设当点击日期文本字段时,会出现带有完成按钮的日期选择器。为此在 一些.h文件

    /*****keyboard Done button   ***/
    
    
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    {
       IBOutlet UIDatePicker *picker1;
        IBOutlet UITextField *txtFld;
    
    }
    @property (nonatomic, retain) UIToolbar *keyboardToolbar;
    
    @end
    

    在一些.m 文件中

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
             [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
     picker1=[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 300)];//frames are just for demo
     [txtFld setInputView:picker1];
    }
    
    - (void)keyboardWillShow:(NSNotification *)notification
    {
        if(keyboardToolbar == nil) {
            keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 410, 320, 44)] ;
            [keyboardToolbar setBarStyle:UIBarStyleBlackTranslucent];
            [keyboardToolbar sizeToFit];
    
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.4];
    
            UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    
            UIBarButtonItem *doneButton1 =[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(resignKeyboard)];
            NSArray *itemsArray = [NSArray arrayWithObjects:flexButton,doneButton1, nil];
    
            [keyboardToolbar setItems:itemsArray];
    
    
            [txtFld setInputAccessoryView:keyboardToolbar];
            [self.view addSubview:keyboardToolbar];
            [UIView commitAnimations];
        }
    }
    
    
    
    -(void)resignKeyboard {
    
        [keyboardToolbar removeFromSuperview];
        [txtFld resignFirstResponder];
    ///do nescessary date calculation here
    
        }
    

    【讨论】:

      【解决方案4】:

      在 Swift 5 中

      //Create this variable
      var picker:UIDatePicker?
      
      //Write Date picker code
      picker = UIDatePicker()
      dobTF.inputView = picker//Change your textfield name
      picker?.addTarget(self, action: #selector(handleDatePicker), for: .valueChanged)
      picker?.datePickerMode = .date
      
      //Write toolbar code for done button
      let toolBar = UIToolbar()
      toolBar.barStyle = .default
      toolBar.isTranslucent = true
      let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
      let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(onClickDoneButton))
      toolBar.setItems([space, doneButton], animated: false)
      toolBar.isUserInteractionEnabled = true
      toolBar.sizeToFit()
      dobTF.inputAccessoryView = toolBar
      
      //Date picker function
      @objc func handleDatePicker() {
          let dateFormatter = DateFormatter()
          dateFormatter.dateFormat = "dd-MM-yyyy" //Change your date formate
          let strDate = dateFormatter.string(from: picker!.date)
          dobTF.text = strDate
      }
      
      //Toolbar done button function
      @objc func onClickDoneButton() {
          self.view.endEditing(true)
      }
      

      【讨论】:

        【解决方案5】:

        我愿意!!!!

        -(IBAction)ChooseDate:(id)sender{
        
        btnDone = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        
        [done setTitle:@"GO!" forState:UIControlStateNormal];
        btnDone.backgroundColor = UIColorFromRGB(0x1F1F21);
        btnDone.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
        [btnDone addTarget:self
                   action:@selector(HidePicker:)
         forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btnDone];
        
        
            self.datepicker= [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 216)];
            self.datepicker.datePickerMode = UIDatePickerModeDate;
            datepicker.backgroundColor = Rgb2UIColor(52, 170, 220);
            
            [self.view addSubview:self.datepicker];
        }
        
        
        -(IBAction)HidePicker:(id)sender{
            [UIView animateWithDuration:0.5
                             animations:^{
                                 datepicker.frame = CGRectMake(0, -250, 320, 50);
                             } completion:^(BOOL finished) {
                                 [datepicker removeFromSuperview];
                                 [btnDone removeFromSuperview];
                             }];
        
            [self.datepicker removeFromSuperview];
            NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
            [outputFormatter setDateFormat:@"ddMMyyyy"];
           
            //NSLOG
            NSLog(@"%@",[outputFormatter stringFromDate:self.datepicker.date]);
        }
        

        【讨论】:

          猜你喜欢
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-28
          • 2011-05-11
          相关资源
          最近更新 更多