如何自定义UIDatePicker以实现以下输出?

时间:2017-08-24 07:04:49

标签: ios swift date uidatepicker picker

enter image description here

这是包含日期,日期和月份作为输入的选择器,在一个卷轴中,有没有办法从iOS中的picker / datepicker实现这种功能?

2 个答案:

答案 0 :(得分:1)

执行以下步骤: -
1.您必须在应用DateFormatter()时更改日期。
2.使用NSArray NSMutableArray方法保存UIPickerViewDatasource中的所有日期(字符串格式)。
3.然后拨打UIPickerView DatasourceDelegate方法获取结果。

对于日期转换,您可以应用以下代码。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE dd MMM"
let currentDate = NSDate()

let convertedDateString = dateFormatter.string(from:currentDate as Date)
print("convertedDate: ", convertedDateString)

答案 1 :(得分:1)

对于这种情况,您应该将其添加为 UIPickerView 。假设问题是:如何按当月的日期填写其值?为了更清楚,我会提到它作为步骤:

  • 您应该获得当前月份开始结束日期。您可以通过查看this answer

  • 找到如何实现它
  • 您需要在开始日期和结束日期之间获得所需的所有日期 - 所需的格式。您可以通过查看this answer

  • 找到如何实现它
  • 在获得当月的所有日期后,您可以轻松填写​​日期选择器数据源方法。

<强>实施

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    var currentMonthDays: [String] {
        var array = [String]()

        var date = Date().startOfMonth() // first date
        let endDate = Date().endOfMonth()

        let fmt = DateFormatter()
        //fmt.dateFormat = "dd/MM/yyyy"
        fmt.dateFormat = "EEE dd MMM"

        while date <= endDate {
            date = Calendar.current.date(byAdding: .day, value: 1, to: date)!

            array.append(fmt.string(from: date))
        }

        return array
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(currentMonthDays)
    }

    // Picker View Data Soruce & delegate Methods

    // REMARK: make sure to connect pickerview datasource/delegate to your view controller,
    // I did it from the storyboard
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return currentMonthDays.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return currentMonthDays[row]
    }
}


// Step #1:
extension Date {
    func startOfMonth() -> Date {
        return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
    }

    func endOfMonth() -> Date {
        return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())!
    }
}