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가 열려 있어도 정상적으로 표시됨
'Project > 30MinRead' 카테고리의 다른 글
🎉 타이머가 완료된 시점에 사용자에게 알림을 주기! (0) | 2025.03.23 |
---|---|
🔥 시작일 ➡️ 종료일 포함하여 날짜 계산! (0) | 2025.03.21 |
🤔 실시간.. 버튼 활성화 해보기 (Combine) (0) | 2025.03.19 |
❓ UICalendarSelectionMultiDate에서 특정 조건에서 선택을 막기! (UI 표시 X) (0) | 2025.03.17 |
📚 독서 타이머 일정 생성 앱 기획서 (0) | 2025.03.15 |