개발 - iOS SwiftUI

iOS SwiftUI onAppear에서 Alert 예제

개미v 2023. 10. 16. 15:43

swiftUI는 state 방식이라서 onAppear에서 직접 Alert 띄우지는 못하고
뷰에서 미리 Alert 만들어 놓고 state 상태값을 변경해서 Alert을 띄울 수 있습니다.

 

import SwiftUI
import WebKit

struct IntroView: View {
    
    @State var showAlert = false
    @State var alertTitle: String = ""
    @State var alertMsg: String = ""
    
    var body: some View {
        VStack {
        }
        .alert(isPresented: $showAlert) {
            Alert(title: Text(alertTitle), message: Text(alertMsg), dismissButton: .default(Text("확인"), action: {
                exit(1)
            }))
        }
        .onAppear {
            startMain()
        }
    }
    
    func startMain() {
        // HTTP 요청
        ...

        // HTTP 요청 결과 처리
        session.dataTask(with: request) { data, response, error in
            
            // HTTP 응답코드가 400번대, 500번대의 경우 리턴
            if let response = response as? HTTPURLResponse {
                if response.statusCode >= 400 && response.statusCode <= 599 {
                    self.alertTitle = "버전"
                    self.alertMsg = "서버에서 버전정보를 확인하는데 실패 하였습니다.\n관리자에게 문의해 주시기 바랍니다.\n\n응답코드 : \(response.statusCode)"
                    self.showAlert = true
                }
            }
        }
    }
}

 

참고로 이렇게는 안됩니다(X)

처음에 왜 안되나 한참 해맸는데 바드한테 물어보니 알려줍니다 ㅎㅎ

import SwiftUI
import WebKit

struct IntroView: View {

    var body: some View {
        VStack {
        }
        .onAppear {
            startMain()
        }
    }
    
    func startMain() {
        // HTTP 요청
        ...

        // HTTP 요청 결과 처리
        session.dataTask(with: request) { data, response, error in
            
            // HTTP 응답코드가 400번대, 500번대의 경우 리턴
            if let response = response as? HTTPURLResponse {
                if response.statusCode >= 400 && response.statusCode <= 599 {
                    Alert(title: Text("버전"), message: Text("서버에서 버전정보를 확인하는데 실패 하였습니다."), dismissButton: .default(Text("확인"), action: {
                        exit(1)
                    }))
                }
            }
        }
    }
}