У меня есть массив вроде [«яблоко», «появляется», «Азхар», «код», «BCom»] и т. д. Этот массив содержит более полумиллиона записей.
Теперь я хочу разместить UISearchBar
, как в Google, а затем всякий раз, когда пользователь вводит текст, появляется раскрывающийся список со всеми результатами, содержащими этот текст, и пользователь может выбрать один из списка.
Например, если пользователь вводит «а», то в раскрывающемся списке появятся «яблоко», «появляется» и «азхар».
Я не хочу использовать UITableView
или что-нибудь еще для загрузки записей. Каждый раз, когда пользователь вводит какое-либо слово, он должен собирать записи из массива и раскрывать их, чтобы отобразить их.
Как я могу это сделать? Предложения требуются, пожалуйста.
Можете ли вы предложить что-нибудь, как это сделать?
@NaqeebAhmed какой способ сделать это из теста - Чтобы найти лучший подход, сначала вам нужно задать себе несколько вопросов: (1) Вам действительно нужен такой большой массив? Подумайте, сколько оперативной памяти вы тратите на эти 500 000 строк. (2) Сколько должно быть показано отфильтрованных результатов? Обратите внимание, что в приложениях Google результаты обычно ограничиваются 5-10 результатами, что дает намного лучшую производительность, а затем фильтрует весь массив при каждом событии изменения редактирования. (3) Обратите внимание, что ваш массив - это несортированный «код» перед «BCom», «появляется» перед «Azhar» и т. д. Использование отсортированного массива для поиска может улучшить производительность.
Довольно простой код, который поможет, фильтр панели поиска прост, а для раскрывающегося меню я использую сторонний модуль под названием DropDown, который очень прост в использовании: https://github.com/AssistoLab/DropDown
import UIKit
import DropDown
class ViewController: UIViewController, UISearchBarDelegate {
var data: [String] = ["apple","appear","Azhar","code","BCom"]
var dataFiltered: [String] = []
var dropButton = DropDown()
@IBOutlet weak var searchBar: UISearchBar!
override func viewDidLoad() {
super.viewDidLoad()
dataFiltered = data
dropButton.anchorView = searchBar
dropButton.bottomOffset = CGPoint(x: 0, y:(dropButton.anchorView?.plainView.bounds.height)!)
dropButton.backgroundColor = .white
dropButton.direction = .bottom
dropButton.selectionAction = { [unowned self] (index: Int, item: String) in
print("Selected item: \(item) at index: \(index)") //Selected item: code at index: 0
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
dataFiltered = searchText.isEmpty ? data : data.filter({ (dat) -> Bool in
dat.range(of: searchText, options: .caseInsensitive) != nil
})
dropButton.dataSource = dataFiltered
dropButton.show()
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchBar.setShowsCancelButton(true, animated: true)
for ob: UIView in ((searchBar.subviews[0] )).subviews {
if let z = ob as? UIButton {
let btn: UIButton = z
btn.setTitleColor(UIColor.white, for: .normal)
}
}
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searchBar.showsCancelButton = false
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
searchBar.text = ""
dataFiltered = data
dropButton.hide()
}
}
Братан, люблю твой ответ, но тебе не хватает searchBar.delegate = self внутри didViewLoad (), он никогда не выполнится, если не для него
Неправда, вы можете подключить делегата в раскадровке, что я обычно и делаю. Не нужно писать ненужный код
Если бы я знал это, я уже 3 дня ломал себе голову, пытаясь получить то, что вы показали, и пробовал другие решения, новые для программирования iOs, кстати
Ха-ха, извини, по крайней мере, ты открыл что-то новое
Большое спасибо, вы сохранили само приложение, еще раз спасибо