Ограничение часов и минут в DatePicker- swift?

#swift #uidatepicker

#swift #uidatepicker

Вопрос:

привет, ребята, я пытаюсь создать средство выбора времени, часы которого указаны только с (2pm — 9pm), а минуты увеличиваются на 30. это изображение TimePicker, которое я хочу создать, вот мой код

 func creatTimePicker() {
        timePicker.datePickerMode = .time
        timePicker.minuteInterval = 30
        let timeformatter = DateFormatter()
        timeformatter.dateFormat = "HH:mm"

        let min = timeformatter.date(from: "5:00")
        let max = timeformatter.date(from: "9:00")
        timePicker.minimumDate = min
        timePicker.maximumDate = max
        self.contentView.addSubview(timePicker)
    } 
  

проблема в том, что час начинается с 1-12, а минута начинается с 00-59 в чем проблема? Спасибо

Комментарии:

1. установите минимальную дату «14:00» и максимальную дату «21:00», попробуйте это.

2. не сработало: (

Ответ №1:

Проблема в том, что вам нужно установить свойство date для выбора даты, чтобы оно также соответствовало минимальной дате. Вам также необходимо установить дату форматирования даты по умолчанию на сегодня и не забудьте установить для языкового стандарта значение «en_US_POSIX» при анализе строки даты время:

 extension Formatter {
    static let time: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = .init(identifier: "em_US_POSIX")
        formatter.dateFormat = "HH:mm"
        return formatter
    }()
}
  

 let timePicker = UIDatePicker()
func creatTimePicker() {
    Formatter.time.defaultDate = Calendar.current.startOfDay(for: Date())
    let minimumDate = Formatter.time.date(from: "14:00")!
    let maximumDate = Formatter.time.date(from: "21:00")!
    timePicker.date = minimumDate 
    timePicker.datePickerMode = .time
    timePicker.minuteInterval = 30
    timePicker.minimumDate = minimumDate
    timePicker.maximumDate = maximumDate
    self.contentView.addSubview(timePicker)
}
  

Комментарии:

1. спасибо, Лео, за вашу помощь, но как я могу показывать ТОЛЬКО часы с 5-9??

2. Что вы имеете в виду? minuteInterval = 60 и измените minimumDate и maximumDate

Ответ №2:

Вы можете использовать Calendar для ограничения временного диапазона для UIDatePicker()

         let picker = UIDatePicker()
        picker.datePickerMode = .time
        
        let minDate = Calendar.current.date(bySettingHour: 14, minute: 0, second: 0, of: Date()) // 2PM
        
        let maxDate = Calendar.current.date(bySettingHour: 21, minute: 0, second: 0, of: Date()) // 9PM
    
        picker.minimumDate = minDate
        picker.maximumDate = maxDate
  

Это не позволит пользователю выбирать время за пределами указанного временного диапазона.

На случай, если вы хотите показывать только эти часы

Вы можете использовать UIPickerView

Пример:

 let picker = UIPickerView()
picker.dataSource = self
picker.delegate = self

let hoursRange = Array(5...9)

// Data source

func numberOfComponents(in: UIPickerView) -> Int {
        return 2
    }
    
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        print("Com :(component)")
        if component == 0 {
            return hoursRange.count
        }
        
        return 1 // For the PM indicator
    }

// Delegate
    
func pickerView(_ pickerView: UIPickerView,
     titleForRow row: Int,
     forComponent component: Int) -> String? {
        switch component {
        case 0:
            return "(hoursRange[row])"
        case 1:
            return "AM"
        default:
            return nil
        }
    }

  

Комментарии:

1. большое вам спасибо за вашу помощь единственное, что я рассматриваю сейчас, это диапазон часов, чтобы показывать только 5-9. вышеуказанные функции просто включают часы 5-9, но все еще показывают 1-12 !! ?

2. Вам придется создавать UIPickerView со строками компонента, которые вы добавляете вручную из 5-9. В противном случае вы не сможете скрыть их в UIDatePicker