본문 바로가기
Programming/Swift

SwiftUI Coordinator

by JH-M 2023. 3. 9.

SwiftUI Coordinator는 SwiftUI 뷰와 UIKit 혹은 AppKit 뷰 사이의 통신을 관리하는 객체입니다. SwiftUI에서는 Coordinator를 사용하여 UIKit 혹은 AppKit 뷰의 라이프사이클과 이벤트를 SwiftUI 뷰와 동기화할 수 있습니다.

 

SwiftUI에서 Coordinator는 NSObject를 상속받는 클래스로 구현됩니다. Coordinator는 View의 타입 매개변수와 함께 제네릭으로 선언됩니다. 예를 들어, UIKit의 UIPickerView와 함께 사용되는 Coordinator는 다음과 같이 구현할 수 있습니다.

 

class PickerCoordinator: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
    var values: [String]
    var selection: Binding<String>

    init(values: [String], selection: Binding<String>) {
        self.values = values
        self.selection = selection
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return values.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return values[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        selection.wrappedValue = values[row]
    }
}

 

 

위의 코드에서는 PickerCoordinator 클래스를 구현하고, UIPickerViewDelegate 및 UIPickerViewDataSource 프로토콜을 구현합니다. 이 클래스는 values와 selection Binding을 포함하며, UIPickerView의 선택 항목을 처리합니다. didSelectRow 메서드에서는 selection Binding의 값을 업데이트하여 SwiftUI 뷰와 동기화합니다.

 

SwiftUI 뷰에서는 Coordinator를 생성하여 사용합니다. 이를 위해, makeCoordinator() 메서드를 구현하여 Coordinator를 생성해야 합니다. 다음은 SwiftUI에서 UIPickerView를 사용하는 예제 코드입니다.

 

struct PickerExampleView: UIViewRepresentable {
    var values: [String]
    @Binding var selection: String

    func makeUIView(context: Context) -> UIPickerView {
        let pickerView = UIPickerView()
        pickerView.dataSource = context.coordinator
        pickerView.delegate = context.coordinator
        return pickerView
    }

    func updateUIView(_ pickerView: UIPickerView, context: Context) {
        pickerView.selectRow(values.firstIndex(of: selection) ?? 0, inComponent: 0, animated: true)
    }

    func makeCoordinator() -> PickerCoordinator {
        return PickerCoordinator(values: values, selection: $selection)
    }
}

 

 

위의 코드에서는 PickerExampleView 구조체를 정의하고, UIViewRepresentable 프로토콜을 준수하여 UIPickerView와 상호작용합니다. makeUIView 메서드에서는 UIPickerView를 생성하고, updateUIView 메서드에서는 UIPickerView를 업데이트합니다. makeCoordinator 메서드에서는 PickerCoordinator를 생성하여 반환합니다. PickerExampleView에서 makeCoordinator()를 호출하면, Coordinator를 생성하여 UIPickerView와 SwiftUI 뷰를 연결합니다.

 

Coordinator는 SwiftUI와 UIKit 혹은 AppKit 뷰 간의 통신을 관리하는 중요한 역할을 수행합니다. 이를 통해, SwiftUI 뷰와 UIKit 혹은 AppKit 뷰를 함께 사용하여 사용자 지정 UI를 만들 수 있습니다.

댓글