英文:
Search that distinguishes the first letters and not the entire character with SearchBar in Swift
问题
我有一个字符数组,当我搜索并输入“Co”时,例如,我会得到两个匹配项(我不想要这样)。我只想搜索以特定字符开头的内容。
我分享字符串数组和Swift中的textDidChange方法
例如:
listEmployed = ["Conejo","Tetera","Aviteon","Sacoja"]
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
isSearching = true
arrayFilterEmployed = listEmployed
if searchText.isEmpty == false {
arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().range(of: searchText.lowercased(), options: .caseInsensitive) != nil})
}
if arrayFilterEmployed?.count == 0 {
searchBar.showsCancelButton = false
foundLabel?.isHidden = false
}
else {
categoryTableView?.reloadData()
foundLabel?.isHidden = true
}
categoryTableView?.reloadData()
}
英文:
I have an array of characters and when I search and enter "Co" for example, I get two matches (I don't want that). I want only what begins with a specific character to be searched.
I share the array of strings and the method textDidChange in Swift
For example:
listEmployed = ["Conejo","Tetera","Aviteon","Sacoja"]
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
isSearching = true
arrayFilterEmployed = listEmployed
if searchText.isEmpty == false {
arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().range(of: searchText.lowercased(), options: .caseInsensitive) != nil})
}
if arrayFilterEmployed?.count == 0 {
searchBar.showsCancelButton = false
fountLabel?.isHidden = false
}
else {
categoryTableView?.reloadData()
fountLabel?.isHidden = true
}
categoryTableView?.reloadData()
}
答案1
得分: 2
只需添加.anchored
选项。由于您正在使用.caseInsensitive
,因此不需要调用lowercased()
:
if !searchText.isEmpty {
arrayFilterEmployed = listEmployed?.filter({$0.text.range(of: searchText, options: [.caseInsensitive, .anchored]) != nil})
}
.anchored
表示检查只会在字符串的开头通过。如果选项还包括.backwards
,那么.anchored
将意味着匹配必须位于字符串的末尾。
英文:
You just need to add the .anchored
option. And since you are using .caseInsensitive
, you don't need the calls to lowercased()
:
if !searchText.isEmpty {
arrayFilterEmployed = listEmployed?.filter({$0.text.range(of: searchText, options: [.caseInsensitive, .anchored]) != nil})
}
.anchored
means the check will only pass if at the start of the string. If the options also included .backwards
, then .anchored
would mean the match must be at the end of the string.
答案2
得分: 1
你可以使用hasPrefix来过滤数据,在搜索栏中输入的文本将会根据此进行数据筛选。
用以下行替换:
arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().range(of: searchText.lowercased(), options: .caseInsensitive) != nil})
使用以下内容(区分大小写的搜索)进行替换:
arrayFilterEmployed = listEmployed?.filter({$0.text.hasPrefix(searchText) != nil})
并使用以下内容(不区分大小写的搜索)进行替换:
arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().hasPrefix(searchText.lowercased()) != nil})
英文:
In your case, you can filter data by using the hasPrefix. It will filter out the data based on the text you entered in the search bar.
Replace the following line:
arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().range(of: searchText.lowercased(), options: .caseInsensitive) != nil})
with (case-sensitive search)
arrayFilterEmployed = listEmployed?.filter({$0.text.hasPrefix(searchText) != nil})
and replace with the following (case-insensitive search)
arrayFilterEmployed = listEmployed?.filter({$0.text.lowercased().hasPrefix(searchText.lowercased()) != nil})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论