2010-09-24 3 views
19

Я только что начал использовать UIDatePicker в своем приложении для iPad, но есть ли способ проверить, когда дата была изменена?UIDatePicker - дата изменилась

Я хочу что-то сделать, когда изменится дата. Надеюсь, вы можете помочь, спасибо.

ответ

69

При правильной настройке, A объекта UIDatePicker посылает действие сообщения, когда пользователь заканчивает вращая одно из колес, чтобы изменить дату или время ; связанное с ним событие управления - это UIControlEventValueChanged.

поэтому вам нужно добавить свой класс для обработки UIControlEventValueChanged события в вашем подборщике:

[picker addTarget:self action:@selector(dateChanged:) 
       forControlEvents:UIControlEventValueChanged]; 
... 

- (void) dateChanged:(id)sender{ 
    // handle date changes 
} 
+0

Стоит отметить, что часть ': (id) отправителя необходима для работы функции dateChanged. Вы получите ошибки без него. –

+1

@Chimp Я не вижу, что на самом деле необходим отправитель: (id), по крайней мере, на iOS 5. Возможно, проверьте, соответствует ли ваша декларация вашей реализации. –

+0

: (id) отправитель сам по себе не является «необходимым», но это полезное соглашение, которое используется в SDK для iOS. Если вы не хотите: (id) отправителя следовать методу, сделайте следующее: [picker addTarget: self action: @selector (dateChange) forControlEvents: UIControlEventValueChanged]; – Ben

0

Свифта версии

override func viewDidLoad() { 
    super.viewDidLoad() 
    let picker = UIDatePicker(frame: CGRectMake(0, 0, 200, 200)) 
    picker.addTarget(self, action: #selector(datePickerChanged(_:)), forControlEvents: .ValueChanged) 
    view.addSubview(picker) 
} 

func datePickerChanged(picker: UIDatePicker) { 
    print(picker.date) 
} 
2

Swift 3 версия:

override func viewDidLoad() { 
    super.viewDidLoad() 

    if sYourSelectedDate == "" { 
     if let plist = Plist(name: "YourPlistName") { 
      sYourSelectedDate = plist.getSingleValueInPlistFile(sFieldName: "yourSelectedDate")! 

     } 
    } 
    if sYourSelectedDateTime == "" { 
     if let plist = Plist(name: "YourPlistName") { 
      sYourSelectedDateTime = plist.getSingleValueInPlistFile(sFieldName: "yourSelectedDateTime")! 

     } 
    } 

    // add dateTimePickerChanged event (e.g., if device is powered down, values get saved) 
    self.dateTimePicker.addTarget(self, action: #selector(dateTimeChanged), for: .valueChanged); 

    // set min and max dates of datetimePicker 
    // subtracting 1 minute from current time 
    let currentTempDate = NSDate() 
    let newDate = currentTempDate.addingTimeInterval(-1 * 60); 
    let currentDate = newDate; 

    let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 

    calendar.timeZone = NSTimeZone(name: "US/Eastern")! as TimeZone 

    let components: NSDateComponents = NSDateComponents() 
    components.calendar = calendar as Calendar 

    components.year = -1 
    let minDate: NSDate = calendar.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! as NSDate 

    let maxDate: NSDate = currentDate as NSDate 

    self.dateTimePicker.minimumDate = minDate as Date 
    self.dateTimePicker.maximumDate = maxDate as Date 

    //print("minDate: \(minDate)") 
    //print("maxDate: \(maxDate)") 

    if(sYourSelectedDateTime == "") 
    { 
     // subtracting 1 minute from current time 
     let currentTempDate = NSDate() 
     let newDate = currentTempDate.addingTimeInterval(-1 * 60); 
     let currentDate2 = newDate; 

     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 

     calendar.timeZone = NSTimeZone(name: "US/Eastern")! as TimeZone 

     let userCalendar = Calendar.current 
     let requestedComponents: Set<Calendar.Component> = [ 
      .year, 
      .month, 
      .day, 
      .hour, 
      .minute 
     ] 

     let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDate2 as Date) 

     let iPhoneDateComponents = NSDateComponents() 
     iPhoneDateComponents.year = dateTimeComponents.year!; 
     iPhoneDateComponents.month = dateTimeComponents.month!; 
     iPhoneDateComponents.day = dateTimeComponents.day!; 
     iPhoneDateComponents.hour = dateTimeComponents.hour!; 
     iPhoneDateComponents.minute = dateTimeComponents.minute!; 
     iPhoneDateComponents.timeZone = NSTimeZone(name: "US/Eastern") as TimeZone? 

     let iPhoneDate = calendar.date(from: iPhoneDateComponents as DateComponents)! 

     self.dateTimePicker.date = iPhoneDate; 
     sYourInitialDateTime = dateFormatter.string(from: self.dateTimePicker.date); 

     if let plist = Plist(name: "YourPlistFile") { 
      plist.editSingleValueInPlistFile(dictString: "YourPlistFile", sFieldName: "yourInitialDateTime", sValue: sYourInitialDateTime) 
     } 

    } else { 
     let dateFormatter: DateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 
     let dateObj = dateFormatter.date(from: sYourSelectedDateTime) 
     self.dateTimePicker.date = dateObj! 
    } 

} 

func dateTimeChanged(picker: UIDatePicker) { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MM/dd/yyyy" 
    sYourSelectedDate = dateFormatter.string(from: picker.date); 
    dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 

    sYourSelectedDateTime = dateFormatter.string(from: picker.date); 

    if (sYourSelectedDateTime == sYourInitialDateTime) 
    { 
     sYourSelectedDate = ""; 
     sYourSelectedDateTime = ""; 
    } 

    if let plist = Plist(name: "YourPlistFile") { 
     plist.editSingleValueInPlistFile(dictString: "YourPlistName", sFieldName: "yourSelectedDate", sValue: sYourSelectedDate) 
     plist.editSingleValueInPlistFile(dictString: "YourPlistName", sFieldName: "yourSelectedDateTime", sValue: sYourSelectedDateTime) 

    } else { 
     print("Unable to get Plist") 
    } 
    print(sYourSelectedDate); 
    print(sYourSelectedDateTime); 

} 
+0

Это не работает, если вы нажмете кнопку «Сделано», чтобы установить значение по умолчанию. Мне нужно прокрутить до другого значения и прокрутить назад до значения по умолчанию, а затем щелкнуть мышью. Есть идеи? – Ryan

+0

Ryan. Я сохраняю только значения, выбранные в файле UIDatePicker, в файл Plist для каждого выбора, поэтому, если приложение закрыто в любой форме или выключено, последнее значение может быть перезагружено при повторном запуске программы. Не сохранять значение только в сборщике. Данные хранятся на этом пути мимо элемента управления. Нет кнопки, если сборщик перетаскивается из элементов управления в форму. – 2017-06-29 17:48:09

0

Swift 4 версия:

Настройка

UIDatePicker:

let datePicker = UIDatePicker() 
    datePicker.datePickerMode = .date 
    dateTextField.inputView = datePicker 
    datePicker.addTarget(self, action: #selector(datePickerChanged(picker:)), for: .valueChanged) 

Функция:

@objc func datePickerChanged(picker: UIDatePicker) { 
    print(picker.date) 
} 

Если вы заметили, Swift 4 требует @objc в функции, если вы собираетесь использовать #selector()

Смежные вопросы