viewDidLoad()에서 alert 메시지 창이 화면에 출력되지 않는 문제

Updated:

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