본문 바로가기

카테고리 없음

❌ 날짜 선택하는 순서에 따라 startDate, endDate 결정...

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()에서 정렬 처리가 안 되어도, 이 단계에서 다시 보정 가능