본문 바로가기

Project/30MinRead

❌ 날짜 잘못 선택하면.. 오류창 띄워야 하는데..

Attempt to present <UIAlertController: 0x106017400> on <ReadAloudDaily.AddPlanViewController: 0x106008200> 
(from <ReadAloudDaily.AddPlanViewController: 0x106008200>) which is already presenting <_UIDatePickerContainerViewController: 0x103c5f280>.

✅ 무슨 뜻인가?

  • UIAlertController를 띄우려고 했는데, 이미 UIDatePicker가 화면에 떠 있는 상태
  • 즉, UIDatePicker(날짜 선택기)가 presented 상태라서, UIAlertController를 추가로 띄울 수 없음
  • UIAlertController는 한 번에 하나만 띄울 수 있음

 

✅ 해결 방법: UIDatePicker 닫힌 후에 UIAlertController 띄우기

🔨 dismiss(animated:completion:)로 UIDatePicker 닫은 후 UIAlertController 띄우기

👉 먼저 UIDatePicker를 닫고, 완료 후 UIAlertController를 띄움

viewModel.$isDateValid
    .sink { [weak self] isValid in
        guard let self = self else { return }
        if !isValid {
            // ✅ 현재 `presentedViewController`가 있으면 먼저 닫기
            if let presentedVC = self.presentedViewController {
                presentedVC.dismiss(animated: true) {
                    DispatchQueue.main.async {
                        self.showAlert(title: "날짜 오류", message: "선택하신 시작일과 종료일을 다시 확인해주세요 😅")
                    }
                }
            } else {
                self.showAlert(title: "날짜 오류", message: "선택하신 시작일과 종료일을 다시 확인해주세요 😅")
            }
        }
    }
    .store(in: &cancellables)

 

✅ UIDatePicker가 떠 있는 경우 먼저 dismiss(animated:) 한 후 UIAlertController 실행
✅ dismiss()가 완료된 후 completion에서 UIAlertController 실행

 

 

Toast 메시지로 대체 (UIAlertController 대신)

👉 아예 UIAlertController 대신 화면 하단에 Toast 메시지를 사용

viewModel.$isDateValid
    .sink { [weak self] isValid in
        guard let self = self else { return }
        if !isValid {
            self.showToast(message: "선택하신 시작일과 종료일을 다시 확인해주세요 😅")
        }
    }
    .store(in: &cancellables)


✅ showToast()는 UIAlertController처럼 다른 presentedViewController에 영향을 주지 않음
✅ UIDatePicker가 열려 있어도 정상적으로 표시됨