Joã*_*aço 7 tokenize ios swiftui
我怎样才能TextField在 SwiftUI 中拥有像 这样的令牌UISearchBar?
我尝试插入一个,以便我可以使用它们,但我失去了和 之间UISearchBar的交互行为。TextFieldList
对于 iOS 16 之前的版本,最好的方法似乎是UIViewRepresentable为 a UISearchBarwith token 制作一个支柱。
它有一个用于存储在数组 中的搜索文本的绑定searchText。其中每个元素都有每个标记的文本。
/// Brings UISearchBar to SwiftUI. This enables using tokens for searching for iOS and macOS.
struct TokenSearchBar {
@Binding var searchText: [String]
}
extension TokenSearchBar: UIViewRepresentable {
internal func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> UISearchBar {
//Configures the Search Bar
let searchBar = UISearchBar()
searchBar.delegate = context.coordinator
return searchBar
}
func updateUIView(_ searchBar: UISearchBar, context: Context) {
if context.coordinator.searchText != searchText {
context.coordinator.searchText = searchText
}
}
/// Coordinator and delegate for the searchbar
internal class Coordinator: NSObject, UISearchBarDelegate {
var parent: TokenSearchBar
var searchBar: UISearchBar?
var searchText: [String] = [] {
didSet {
guard let searchBar = searchBar else {
return
}
//get the current search array
var tokenSearchText = searchText
let lastSearchTextItem: String
if tokenSearchText.isEmpty {
lastSearchTextItem = ""
} else {
lastSearchTextItem = tokenSearchText.removeLast()
}
//compare them with the search array
tokenSearchText.enumerated().forEach {
offset, searchString in
//Get the current tokens.
let currentTokens = searchBar.searchTextField.tokens
//Check if the number of tokens on display can be displayed with this offset. If not it will create a new token at the end.
if currentTokens.count > offset {
//Check if the token at this offset has the same object as the searchstring. If not will insert a new token on this offset.
//I will assume that all represented objects are strings
if let representedObject = currentTokens[offset].representedObject as? String, representedObject != searchString {
let newToken = UISearchToken(icon: nil, text: searchString)
newToken.representedObject = searchString
searchBar.searchTextField.tokens.insert(newToken, at: offset)
}
} else {
let newToken = UISearchToken(icon: nil, text: searchString)
newToken.representedObject = searchString
self.searchBar?.searchTextField.tokens.append(newToken)
}
}
//Trim the number of tokens to be equal to the tokenSearchText
let tokensToRemove = searchBar.searchTextField.tokens.count - tokenSearchText.count
if tokensToRemove > 0 {
searchBar.searchTextField.tokens.removeLast(tokensToRemove)
}
//make the search field text equal to lastSearchTextItem
if searchBar.text != lastSearchTextItem {
searchBar.text = lastSearchTextItem
}
if parent.searchText != self.searchText {
parent.searchText = self.searchText
}
}
}
init(_ searchBar: TokenSearchBar) {
self.parent = searchBar
}
//MARK: UISearchBarDelegate implementation
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
self.searchBar = searchBar
searchText = []
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
self.searchBar = searchBar
//add a new level to the search
if searchText.last?.trimmingCharacters(in: .whitespacesAndNewlines) != "" {
searchText.append("")
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.searchBar = searchBar
if self.searchText.last != nil, self.searchText[self.searchText.count - 1] != searchText {
self.searchText[self.searchText.count - 1] = searchText
} else {
var tokenText = searchBar.searchTextField.tokens.compactMap{$0.representedObject as? String}
tokenText.append(searchText)
self.searchText = tokenText
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 iOS 16 中,Apple 添加了 SwiftUI 支持以searchable查看修饰符,例如searchable(text:tokens:placement:prompt:token:)(API 文档)
文档中的示例
enum FruitToken: Identifiable, Hashable, CaseIterable {
case apple
case pear
case banana
var id: Self { self }
}
@State private var tokens: [FruitToken] = []
ProductList()
.searchable(text: $text, tokens: $tokens) { token in
switch token {
case .apple: Text("Apple")
case .pear: Text("Pear")
case .banana: Text("Banana")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2875 次 |
| 最近记录: |