티스토리 뷰

기존의 swift에서는 delegate으로 정말 많은 것들을 처리했었다. 

class myViewController: UIViewController, MTMapViewDelegate {
  // 클래스 안에서 delegate 함수들을 처리 할 수 있다
}

 

정말 편했는데...

 

이제 SwiftUI에서는 ViewController가 없으므로 delegate도 사용을 못하는걸까?! 

그렇지 않다. delegate를 살리기 위해 애플이 만들어준, Coordinator을 사용하면 된다!!!!!!!

 

* 주의 - UIKit의 coordinator pattern과는 전혀! 무관합니다. 

 

1. UIViewRepresentable에서 Coordinator쓰기

struct KakaoMapView: UIViewRepresentable {
   func makeUIView(context: Context) -> MTMapView {
     let view = MTMapView(frame: .zero)
     return view
   }
   
   func updateUIView(_ view: MTMapView, context: UIViewRepresentableContext<KakaoMapView>) {
   }
}

내가 만든, 이렇게 생긴 KakaoMapView가 있다. 

만약 UIViewRepresentable말고, UIViewControllerRepresentable을 사용하고자 하자면 스크롤 내려서 밑쪽으로 가길..

 

[Coordinator 쓰는 법]

① class Coordinator {} 을 추가해준다. 

struct KakaoMapView: UIViewRepresentable {
   func makeUIView(context: Context) -> MTMapView {
     let view = MTMapView(frame: .zero)
     return view
   }
   
   func updateUIView(_ view: MTMapView, context: UIViewRepresentableContext<KakaoMapView>) {
   }
   class Coordniator { }
}

굳이 struct안에 정의하지 않아도 상관은 없다. 하지만 여러개의 struct에 여러개의 Coordinator가 필요한데 Coordinator을 struct 밖에 정의해 놓았다면... ㅠ 그러니 안에다가 쓰는게 깔끔하고 좋다 ㅎㅎ 이름은 꼭 Coordinator가 아니여도 상관은 없다. makeCoordinator()함수를 통해서 정의하기 때문!

 

 

② func makeCoordinator() {}을 추가해준다. 

struct KakaoMapView: UIViewRepresentable {
   func makeUIView(context: Context) -> MTMapView {
     let view = MTMapView(frame: .zero)
     return view
   }
   
   func updateUIView(_ view: MTMapView, context: UIViewRepresentableContext<KakaoMapView>) {
   }
   
   class Coordniator { }
   
   func makeCoordinator() -> Coordinator {
     return Coordinator()
   }
}

 

makeCoordinator을 구현해주는 것 만으로도, KakaoMapView struct는 Coordinator의 존재를 알게 된다. 

 

 

 

③ 이제 MTMapView에도 coordinator에 전달하라고 시켜줘야 한다. makeUIView 함수에 다음의 코드를 추가해준다. 

view.delegate = context.coordinator

* 우리는 makeCoordinator()함수를 직접 콜 해줄 필요가 없다. 자동으로 된다

* makeUIView랑 updateUIIView하면서 coordinator 자동으로 던져준다.

 

 

④ 지금 상태로는 컴파일이 안되니까, Coordinate 클래스가 delegate 역할을 할 수 있게 구현해준다. (기존 코드 수정)

class Coordinator: NSObject, MTMapViewDelegate {

 

* NSObject를 채택해주면, runtime functionality를 확인하게 해준다고 한다. (?)

 

 

 

2. UIViewControllerRepresentable에서 Coordinator쓰기

struct ImagePicker: UIViewControllerRepresentable {
    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
        let picker = UIImagePickerController()
        return picker
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {

    }
}

stackoverflow.com/questions/57281389/implement-delegates-within-swiftui-views

이런식으로 쓰면 View없이도 delegate만 사용할 수 있다!!!!

 

 

 

[참고]

www.hackingwithswift.com/books/ios-swiftui/using-coordinators-to-manage-swiftui-view-controllers

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
26 27 28 29 30 31
글 보관함