【问题标题】:UIDatePicker upon date changed日期更改时的 UIDatePicker
【发布时间】:2011-04-16 16:23:39
【问题描述】:

我刚开始在我的 iPad 应用程序中使用 UIDatePicker,但有没有办法检查日期何时更改?

我想在日期更改时做点什么。我可以尝试什么?

【问题讨论】:

    标签: iphone objective-c uidatepicker


    【解决方案1】:

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

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

    [picker addTarget:self action:@selector(dateChanged:) 
                  forControlEvents:UIControlEventValueChanged];
    ...
    
    - (void) dateChanged:(id)sender{
       // handle date changes
    }
    

    【讨论】:

    • 值得注意的是:(id)sender 部分对于dateChanged 函数的工作是必不可少的。没有它你会得到错误。
    • @Chimp 我看不到 :(id)sender 确实需要,至少在 iOS 5 上不需要。也许检查您的声明是否与您的实现匹配。
    • :(id)sender 本身并不是“必需的”,但它是一个在整个 iOS SDK 中使用的有用约定。如果您不希望 :(id)sender 遵循该方法,请执行以下操作:[picker addTarget:self action:@selector(dateChange) forControlEvents:UIControlEventValueChanged];
    【解决方案2】:

    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)
    }
    

    如果你注意到,如果你打算使用 #selector()

    ,Swift 4 需要在函数中包含 @objc

    【讨论】:

      【解决方案3】:

      快捷版

      override func viewDidLoad() {
          super.viewDidLoad()
          let picker = UIDatePicker(frame: CGRectMake(0, 0, 200, 200))
          picker.addTarget(self, action: #selector(datePickerChanged(picker:)), for: .valueChanged)
          view.addSubview(picker)
      }
      
      @objc func datePickerChanged(picker: UIDatePicker) {
          print(picker.date)
      }
      

      【讨论】:

        【解决方案4】:

        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);
        
        }
        

        【讨论】:

        • 如果您单击完成设置默认值,这似乎不起作用。我必须滚动到不同的值并滚动回默认值,然后单击完成。有什么想法吗?
        • Ryan,我只在每次选择时将 UIDatePicker 中选择的值保存到 Plist 文件中,因此如果应用程序在任何表单上关闭或关闭,则可以在程序启动时重新加载上次选择的值再次。不仅在选择器中节省价值。数据以这种方式存在于控制之外。如果选择器从控件拖到窗体,则没有按钮。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 1970-01-01
        相关资源
        最近更新 更多