viewDidLoad()에서 alert 메시지 창이 화면에 출력되지 않는 문제
1. Problem
viewDidLoad()안에서 어떤 기능을 초기화 하는 함수를 만들고, 초기화 도중 실패하면 alert 창을 띄어서 오류 메시지를 화면에 출력하려 했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.initializeSomething()
}
func initializeSomething() {
guard let something = readSomethinng() else {
let alert = UIAlertController(title: "에러", message: "에러 내용", preferredStyle: .alert)
let ok = UIAlertAction(title: "확인", style: .default, handler: nil)
alert.addAction(ok)
self.present(alert, animated: false)
}
}
}
실행하면 에러는 아니지만 alert 창이 표시되지 않고 경고문구만 콘솔에 출력된다.
Warning: Attempt to present <UIAlertController: 0x7fa9f1018800> on <*.ViewController: 0x7fa9ee70aa40> whose view is not in the window hierarchy!
2. Solution
경고 문구를 검색해보니 내용은 대략 이렇다.
Warning: Attempt to present <UIAlertController: 0x7fa9f1018800> on <*.ViewController: 0x7fa9ee70aa40> whose view is not in the window hierarchy!
ViewConroller:viewDidLoad에서 present()를 시도하는데, 이때 아직 뷰가 윈도우 계층에 없어!
그러니 뷰가 그려진 후 호출되는 viewDidApear() 안에서 alert을 띄우면 된다는 답변이 많았다.
하지만 나는 veiwDidLoad()에서 띄우고 싶었다.
더 검색해보니 디스패치 큐를 사용하라는 내용을 보고 코드를 수정했다. 참고링크
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.initializeSomething()
}
func initializeSomething() {
guard let something = readSomethinng() else {
let alert = UIAlertController(title: "에러", message: "에러 내용", preferredStyle: .alert)
let ok = UIAlertAction(title: "확인", style: .default, handler: nil)
alert.addAction(ok)
//self.present(alert, animated: false)
DispatchQueue.main.async {
self.present(alert, animated: false)
}
}
}
}
수정한 결과 alert 메시지 창이 출력됐다.
Leave a comment