티스토리 뷰
기존의 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
'macOS, iOS' 카테고리의 다른 글
[iOS] svg 이미지 왜 안쓰냐ㅡㅡ (0) | 2020.01.15 |
---|---|
업데이트된 Xcode 프로젝트로 iOS 12 지원하기 (0) | 2020.01.15 |
Xcode 다중커서 (1) | 2020.01.13 |
[iOS] GoogleService-info.plist 파일을 두개 넣어야 할 때 (0) | 2020.01.13 |
xcode 옵션 + 클릭해서 split이 안될 때: focus mode (0) | 2020.01.10 |