【问题标题】:Change Current Date To One Before / One After - Swift DatePicker将当前日期更改为前一/后一 - Swift DatePicker
【发布时间】:2021-05-15 12:23:53
【问题描述】:

我有一个日期选择器。我想将显示的日期更改为使用手势控制之前或之后的日期。即,当一个人向左滑动时,日期会晚一天,如果一个人向右滑动,日期会晚一天。我不确定如何实现这一点,因为我尝试了以下方法,但我收到一条错误消息,指出“无法转换类型为 'UITextField?”的值?到预期的参数类型“日期”。如果有人可以帮助我或指出我正确的方向,我将不胜感激!谢谢

视图控制器:

    @IBOutlet weak var userDate: UITextField!
    private var datePicker: UIDatePicker?

    override func viewDidLoad() {
        super.viewDidLoad()

        datePicker = UIDatePicker()
        datePicker?.datePickerMode = .date
        datePicker?.addTarget(self, action: #selector(Test.dateChanged(datePicker:)), for: .valueChanged)

        userDate.inputView = datePicker
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
        let todayDate = dateFormatter.string(from: Date.init())
        self.userDate.text = todayDate
        
        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
            swipeLeft.direction = .left
            self.view.addGestureRecognizer(swipeLeft)

        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
            swipeRight.direction = .right
            self.view.addGestureRecognizer(swipeRight)

    }
    
    @objc func handleGesture(gesture: UISwipeGestureRecognizer) -> Void {
        
        if gesture.direction == UISwipeGestureRecognizer.Direction.right {
               print("Swipe Right")
              view.backgroundColor = .black
                // WHERE I WOULD LIKE TO CHANGE THE DATE ONE DAY AFTER
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.left {
               print("Swipe Left")
                view.backgroundColor = .yellow
                // WHERE I WOULD LIKE TO CHANGE THE DATE ONE DAY BEFORE
           }
    }

我尝试了这种方法,但这是我得到错误的地方:

Calendar.current.date(byAdding: .day, value: 1, to: userDate)!

【问题讨论】:

    标签: swift nsdate uidatepicker uiswipegesturerecognizer


    【解决方案1】:

    您正在尝试在此处设置方法需要日期的文本字段:

    Calendar.current.date(byAdding: .day, value: 1, to: userDate)!
    

    从您的问题来看,您似乎想从 textField 中显示的当前日期中添加或减去一天。试试下面的代码来做到这一点。这从 userDate.text 中获取日期,并根据滑动方向添加或减去一天,将 userDate.text 设置为新值。

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var userDate: UITextField!
        private var datePicker: UIDatePicker?
        private let dateFormatter = DateFormatter()
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            datePicker = UIDatePicker()
            datePicker?.datePickerMode = .date
            // datePicker?.addTarget(self, action: #selector(Test.dateChanged(datePicker:)), for: .valueChanged)
    
            userDate.inputView = datePicker
            dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
            let todayDate = dateFormatter.string(from: Date.init())
            self.userDate.text = todayDate
    
            let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
            swipeLeft.direction = .left
            self.view.addGestureRecognizer(swipeLeft)
    
            let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
            swipeRight.direction = .right
            self.view.addGestureRecognizer(swipeRight)
    
        }
    
        @objc func handleGesture(gesture: UISwipeGestureRecognizer) -> Void {
    
            if gesture.direction == UISwipeGestureRecognizer.Direction.right {
                print("Swipe Right")
                // WHERE I WOULD LIKE TO CHANGE THE DATE ONE DAY AFTER
                let date = dateFormatter.date (from: userDate.text ?? dateFormatter.string(from: Date()))!
                let plusDay = Calendar.current.date(byAdding: .day, value: 1, to: date)!
                userDate.text = dateFormatter.string(from: plusDay)
            }
            else if gesture.direction == UISwipeGestureRecognizer.Direction.left {
                print("Swipe Left")
                // WHERE I WOULD LIKE TO CHANGE THE DATE ONE DAY BEFORE
                let date = dateFormatter.date (from: userDate.text ?? dateFormatter.string(from: Date()))!
                let minusDay = Calendar.current.date(byAdding: .day, value: -1, to: date)!
                userDate.text = dateFormatter.string(from: minusDay)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      函数date(byAdding:value:to:options:) 期望将日期类型作为参数传递。您正在传递 UITextField 而不是日期类型。 我想你想做的是

      Calendar.current.date(byAdding: .day, value: 1, to: datePicker.date)!
      

      【讨论】:

        猜你喜欢
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多