2010-09-24 100 views
19

我刚开始在我的iPad应用程序中使用UIDatePicker,但有没有一种检查日期更改的方法?UIDatePicker - 更改日期

我想在日期改变时做点什么。希望你能帮忙,谢谢。

回答

69

当正确配置中,当用户完成旋转车轮 一个改变日期 或时间的 的UIDatePicker对象发送一个动作 消息;相关的控制事件 是UIControlEventValueChanged。

,所以你需要添加类在你的选择器来处理UIControlEventValueChanged事件:

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

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

值得注意的是,':(id)sender'部分对'dateChanged'函数起作用至关重要。没有它你会得到错误。 – 2012-01-22 11:10:49

+1

@Chimp我没有看到:(id)发件人实际上是需要的,至少不是在iOS 5上。也许检查你的声明是否符合你的实现。 – 2012-05-23 14:02:44

+0

:(id)sender本身不是“必需的”,但它是一个在iOS SDK中使用的有用惯例。如果您不想要:(id)发件人跟随该方法,请执行以下操作:[picker addTarget:self action:@selector(dateChange)forControlEvents:UIControlEventValueChanged]; – Ben 2013-12-03 07:53:07

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

斯威夫特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 2017-06-22 00:11:26

+0

Ryan,我只在每次选择时将UIDatePicker中选定的值保存到Plist文件,因此如果应用程序在任何窗体上关闭或关闭最后选择的值,则可以在程序再次启动时重新加载。不只是在选择器中保存值。数据在这条路上过去了。如果将选取器从控件拖放到表单中,则没有按钮。 – 2017-06-29 17:48:09

0

斯威夫特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) 
} 

如果你注意到,斯威夫特4需要@objc在功能,如果你打算使用#selector()