Search code examples
c#iosswiftxamarin.iosuidatepicker

How to close a compact UIDatePicker popup when choosing a date?


I have a UIDatePicker whose Preferred Style is set to Compact and I want to close its calendar popup once the user changes the date. I tried to look for an answer but I can't find anyone talking about it.


Solution

  • If you do want to implement it you need to create a custom Picker .

    in UIViewController

        UITextField textField;
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
    
    
            textField = new UITextField(new CGRect(10, 100, 200, 80));
    
            textField.TextColor = UIColor.Red;
            textField.BackgroundColor = UIColor.LightGray; // you could set the style as you want 
           // textField.Delegate = new MyPickerDelegate();
    
            UIDatePicker datePicker = new UIDatePicker();
            datePicker.BackgroundColor = UIColor.LightGray;
            datePicker.ValueChanged += DatePicker_ValueChanged;
            
            if(UIDevice.CurrentDevice.CheckSystemVersion(14,0))
            {
                datePicker.PreferredDatePickerStyle = UIDatePickerStyle.Inline;
            }
    
            else
            {
                datePicker.PreferredDatePickerStyle = UIDatePickerStyle.Wheels;
            }
    
            textField.InputView = datePicker;
    
            View.AddSubview(textField);
            // Perform any additional setup after loading the view, typically from a nib.
        }
    
        private void DatePicker_ValueChanged(object sender, EventArgs e)
        {
            var picker = sender as UIDatePicker;
    
            var date = picker.Date;
    
            var dateFormatter =new NSDateFormatter();
    
            dateFormatter.DateFormat = "YYYY-MM-dd HH:mm";
    
            var dateString = dateFormatter.ToString(date);
            textField.Text = dateString;
            textField.ResignFirstResponder();
    
    
        }
    
    
        public override void TouchesBegan(NSSet touches, UIEvent evt)
        {
            base.TouchesBegan(touches, evt);
    
            textField.ResignFirstResponder();
    
        }