https://explorer89.tistory.com/389
❓ UICalendarSelectionMultiDate에서 특정 조건에서 선택을 막기! (UI 표시 X)
❓시작일, 종료일을 선택 한 후에, 다른 날짜 선택을 막을 수 있나? (UI 표시 안되게) 🚨 결론: UICalendarSelectionMultiDate에서는 선택을 즉시 해제할 방법이 없음.즉, 세 번째 날짜를 선택했을 때, UI에
explorer89.tistory.com
🚀 문제 원인
👉 현재 selectedStartDate와 selectedEndDate를 업데이트할 때,
👉 날짜를 선택하는 순서에 따라 startDate와 endDate가 결정됨.
👉 하지만 항상 작은 날짜가 startDate, 큰 날짜가 endDate가 되도록 보장해야 함.
✅ 해결 방법: 항상 작은 날짜가 startDate, 큰 날짜가 endDate가 되도록 수정
func multiDateSelection(_ selection: UICalendarSelectionMultiDate, didSelectDate dateComponents: DateComponents) {
guard let newDate = dateComponents.date else { return }
if selectedStartDate == nil {
selectedStartDate = newDate
selectedEndDate = newDate
} else if selectedEndDate == nil {
if newDate < selectedStartDate! {
selectedEndDate = selectedStartDate
selectedStartDate = newDate
} else {
selectedEndDate = newDate
}
} else {
// ✅ 세 번째 날짜 선택 시, 기존 시작일/종료일 중 더 가까운 날짜를 변경
let allDates = [selectedStartDate!, selectedEndDate!, newDate].sorted() // ✅ 날짜 정렬
selectedStartDate = allDates.first
selectedEndDate = allDates.last
}
selectDatesBetween(selection: selection, startDate: selectedStartDate!, endDate: selectedEndDate!)
}
✅ 이제 항상 startDate는 작은 날짜, endDate는 큰 날짜가 됨!
✅ sorted()를 사용하여 날짜를 정렬하면, 순서에 상관없이 항상 최솟값이 startDate, 최댓값이 endDate가 됨
🔹 didSelectedDateRange에서도 작은 날짜가 앞에 오도록 수정
👉 만약 추가적인 보장을 위해, didSelectedDateRange()에서도 startDate와 endDate를 정렬하여 다시 업데이트 가능.
extension AddItemViewController: DatePickerDelegate {
func didSelectedDateRange(startDate: String, endDate: String) {
// ✅ 항상 작은 날짜가 `startDate`, 큰 날짜가 `endDate`가 되도록 보장
let dates = [startDate, endDate].sorted()
self.startDate = dates.first
self.endDate = dates.last
dateTextField.text = "\(self.startDate!) ~ \(self.endDate!)"
}
}
✅ 이제 didSelectedDateRange()에서도 항상 startDate가 작은 날짜, endDate가 큰 날짜가 됨.
✅ 만약 multiDateSelection()에서 정렬 처리가 안 되어도, 이 단계에서 다시 보정 가능