SwiftUI Alert TextField

wimes·2020년 2월 1일
0

iOS/Swift

목록 보기
3/20

swiftUI에서는 Alert textField를 기본적으로는 지원하지 않는 것 같습니다.
(혹시 제가 모를 수도 있으니 아시는 분은 알려주세요 ㅠ)
여기 에서 모두 직접 만들어 사용하는 거 봐서는 직접만들어야 하나봅니다.

Present View 에다가 Alert Form을 만들고 (AlertTextField)
ContentView에서 .alertTextField 형식으로 present 할 생각이었습니다. youtube참고

결국에는 다른 방법을 찾았습니다.여기 에 나온대로 UIAlertController를 만들고 이를 아래의 keyWindow().rootViewController를 이용해 현재 View를 가져오고 여기에 AlertView를 출력하는 방식을 사용하면 될 것 같습니다.

import SwiftUI

struct ContentView: View {
    private func alert() {
        let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
        alert.addTextField() { textField in
            textField.placeholder = "Enter some text"
        }
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ in })
        showAlert(alert: alert)
    }

    func showAlert(alert: UIAlertController) {
        if let controller = topMostViewController() {
            controller.present(alert, animated: true)
        }
    }

    private func keyWindow() -> UIWindow? {
        return UIApplication.shared.connectedScenes
        .filter {$0.activationState == .foregroundActive}
        .compactMap {$0 as? UIWindowScene}
        .first?.windows.filter {$0.isKeyWindow}.first
    }

    private func topMostViewController() -> UIViewController? {
        guard let rootController = keyWindow()?.rootViewController else {
            return nil
        }
        return topMostViewController(for: rootController)
    }

    private func topMostViewController(for controller: UIViewController) -> UIViewController {
        if let presentedController = controller.presentedViewController {
            return topMostViewController(for: presentedController)
        } else if let navigationController = controller as? UINavigationController {
            guard let topController = navigationController.topViewController else {
                return navigationController
            }
            return topMostViewController(for: topController)
        } else if let tabController = controller as? UITabBarController {
            guard let topController = tabController.selectedViewController else {
                return tabController
            }
            return topMostViewController(for: topController)
        }
        return controller
    }
    
    
    var body: some View {
        Button(action: { self.alert() }) { Text("click me") }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
profile
iOS/Swift & Node.js Dev.

0개의 댓글