UIViewRepresentable

在SwiftUI中,有时候我们需要用一些SwiftUI中不存在但是UIKit已有的View的时候,可以考虑使用包装已有的UIView类型,然后提供给SwiftUI使用。
例如,在SwiftUI中使用UISearchBar

protocol UIViewRepresentable : View
    associatedtype UIViewType : UIView
    func makeUIView(context: Self.Context) !" Self.UIViewType
    func updateUIView(
        _ uiView: Self.UIViewType,
        context: Self.Context
    )
}

makeUIView(context:) 需要返回想要封装的 UIView 类型,SwiftUI 在创建一个被封 装的 UIView 时会对其调用。updateUIView(_:context:) 则在 UIViewRepresentable 中的某个属性发生变化,SwiftUI 要求更新该 UIKit 部件时被调用

创建一个SearchBar

struct SearchBar : UIViewRepresentable {
    
    @Binding var text : String
    
    class Cordinator : NSObject, UISearchBarDelegate {
        
        @Binding var text : String
        
        init(text : Binding) {
            _text = text
        }
        
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            text = searchText
        }
    }
    
    func makeCoordinator() -> SearchBar.Cordinator {
        return Cordinator(text: $text)
    }
    
    func makeUIView(context: UIViewRepresentableContext) -> UISearchBar {
        let searchBar = UISearchBar(frame: .zero)
        searchBar.delegate = context.coordinator
        return searchBar
    }
    
    func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext) {
        uiView.text = text
    }
}

你可能感兴趣的:(UIViewRepresentable)