2010-09-24 101 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()