Skip to content

Instantly share code, notes, and snippets.

@hertz315
Last active January 21, 2023 10:44
Show Gist options
  • Save hertz315/d4fc9838d2a10fb1a44203dd705487f0 to your computer and use it in GitHub Desktop.
Save hertz315/d4fc9838d2a10fb1a44203dd705487f0 to your computer and use it in GitHub Desktop.
주소찾기 , 우편주소 모달 띄우기

주소찾기,우편주소 모달 띄우기

UIKit

UIViewController.file

//
//  FindAdress.swift
//  Bueatist
//
//  Created by Hertz on 12/14/22.


import UIKit
import WebKit
import Combine

class FindAdressVC: UIViewController {


    // MARK: - Properties
    // 웹뷰 생성
    var webView: WKWebView?
    // webView 가 로딩될 동안 보여줄 UIActivityIndicatorView 도 인스턴스
    let indicator = UIActivityIndicatorView(style: .medium)

    var adress: String?

    // MARK: - Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        configureUI()
    }

    // MARK: - UI
    private func configureUI() {
        view.backgroundColor = .white
//        setAttributes()
//        setContraints()
    }

    private func setAttributes() {
        // Java Script 가 보내는 메세지를 읽기 위해서 인스턴스 생성
        let contentController = WKUserContentController()
        // 메세지를 받기위해 add 메서드 사용
        contentController.add(self, name: "callBackHandler")

        // contentController 를 WKWebView 와 연결할 수 있도록 도와주는 WKWebViewConfiguration 이 필요합니다.
        let configuration = WKWebViewConfiguration()
        configuration.userContentController = contentController

        // webView 를 인스턴스화 해줍니다.
        webView = WKWebView(frame: .zero, configuration: configuration)
        // webView Delegate 위임.
        self.webView?.navigationDelegate = self

        // webView 가 우편번호 서비스 웹페이지를 띄울 수 있도록 URL 전달
        guard let url = URL(string: "https://hertz315.github.io/Kakao-PostCode/"),
            let webView = webView
            else { return }
        // URLRequest 를 생성해 webView 가 해당 URL 을 load 할 수 있도록 넘겨줍니다.
        let request = URLRequest(url: url)
        webView.load(request)
        indicator.startAnimating()
    }

    private func setContraints() {
        guard let webView = webView else { return }
        view.addSubview(webView)
        webView.translatesAutoresizingMaskIntoConstraints = false

        webView.addSubview(indicator)
        indicator.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            webView.topAnchor.constraint(equalTo: view.topAnchor),
            webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            webView.bottomAnchor.constraint(equalTo: view.bottomAnchor),

            indicator.centerXAnchor.constraint(equalTo: webView.centerXAnchor),
            indicator.centerYAnchor.constraint(equalTo: webView.centerYAnchor),
        ])
    }

    // MARK: - 코디네이터 생성
    func makeCoordinator() -> FindAdressVC.Coordinator {
        return Coordinator(parent: self)
    }

    // MARK: - 코디네이터
    class Coordinator {
        private let parent: FindAdressVC

        init(parent: FindAdressVC) {
            self.parent = parent
        }
    }


}

// Hanlder 가 있어야 Java Script 가 보내는 Message 를 정상적으로 수신할 수 있다.
extension FindAdressVC: WKScriptMessageHandler {
    ////     ⭐️ 함수가 호출되는 타이밍은 유저가 주소를 검색하고 어떤 값을 최종적으로 선택했을 때 호출되게 된다.
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        
        if let data = message.body as? [String: Any] {
            self.adress = data["roadAddress"] as? String ?? ""
            // MARK: - 이전 뷰 Text에 바인딩 시키기 ⭐️
            
        }
        
        self.dismiss(animated: true) {
            print(self.adress ?? "")
        }
    }
}

//webView 가 로드될 때 indicator 를 보여줄 수 있도록 WKNavigationDelegate 프로토콜을 채택하고 코드를 구현
extension FindAdressVC: WKNavigationDelegate {
    
    // webView 로드가 실행될때 호출
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        indicator.startAnimating()
    }
    
    // webView 로드가 끝날때 호출
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        indicator.stopAnimating()
        
    }
    
}

SwiftUI

UIViewController -> View

//
//  FindAdressView.swift
//  Bueatist
//
//  Created by Hertz on 12/14/22.
//

import SwiftUI
import UIKit
import WebKit
import Combine

struct FindAdressView: UIViewControllerRepresentable {
    
    // MARK: - Properties
    @StateObject var signUpVM: BeautistViewModel
    @Environment(\.presentationMode) var presentationMode
    
    
    // 웹뷰 생성
    var webView: WKWebView?
    // webView 가 로딩될 동안 보여줄 UIActivityIndicatorView 도 인스턴스
    let indicator = UIActivityIndicatorView(style: .medium)
    
    
    // MARK: - SwiftUI 에서 나타낼 뷰를 반환⭐️
    func makeUIViewController(context: Context) ->  FindAdressVC {
        let controller = FindAdressVC()
        return controller
    }
    
    // MARK: - 업데이트 할때 마다 함수 호출
    func updateUIViewController(_ uiViewController: FindAdressVC, context: Context) {
        
    }
    
    // MARK: - 코디네이터 생성
    func makeCoordinator() -> FindAdressView.Coordinator {
        return Coordinator(parent: self)
    }
    
    // MARK: - 코디네이터
    class Coordinator {
        
        private let parent: FindAdressView
        
        init(parent: FindAdressView) {
            self.parent = parent
        }
    }
    
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment