在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 在創(chuàng)建一個被封 裝的 UIView 時會對其調(diào)用。updateUIView(_:context:) 則在 UIViewRepresentable 中的某個屬性發(fā)生變化,SwiftUI 要求更新該 UIKit 部件時被調(diào)用
創(chuàng)建一個SearchBar
struct SearchBar : UIViewRepresentable {
@Binding var text : String
class Cordinator : NSObject, UISearchBarDelegate {
@Binding var text : String
init(text : Binding<String>) {
_text = text
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
}
}
func makeCoordinator() -> SearchBar.Cordinator {
return Cordinator(text: $text)
}
func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
let searchBar = UISearchBar(frame: .zero)
searchBar.delegate = context.coordinator
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}