хочу создать панель поиска, как Google, в Swift

У меня есть массив типа ["apple", "appear", "Azhar", "code", "BCom"] и т. д. Этот массив содержит более полумиллиона записей.

Теперь то, что я хочу сделать, это разместить UISearchBar как в google, а затем всякий раз, когда пользователь вводит текст, появляется выпадающий список со всеми результатами, содержащими этот текст, и пользователь может выбрать один из списка.

Например, если пользователь введет «а», то в раскрывающемся списке появятся «яблоко», «появление» и «Азхар».

Я не хочу использовать UITableView или что-то еще для загрузки записей. Всякий раз, когда пользователь вводит какое-либо слово, он должен собирать записи из массива и создавать раскрывающийся список для их отображения.

Как я могу это сделать? Требуются предложения, пожалуйста.


person Naqeeb Ahmed    schedule 10.08.2018    source источник
comment
этот массив содержит более полумиллиона записей... Я не думаю, что это правильный подход для этой цели   -  person B001ᛦ    schedule 10.08.2018
comment
Можете ли вы предложить что-нибудь, как это сделать?   -  person Naqeeb Ahmed    schedule 11.08.2018
comment
@NaqeebAhmed Как лучше всего это сделать. Чтобы найти лучший подход, сначала вам нужно задать себе несколько вопросов: (1) Вам действительно нужен такой большой массив? Подумайте, сколько оперативной памяти вы тратите на эти 500 000 строк. (2) Сколько отфильтрованных результатов должно отображаться? Обратите внимание, что в приложениях Google результаты обычно ограничены 5-10 результатами, что дает гораздо лучшую производительность, чем фильтрация всего массива при каждом событии изменения редактирования. (3) Обратите внимание, что ваш массив представляет собой несортированный код перед BCom, появляется перед Azhar и т. д. Использование отсортированного массива для поиска может повысить производительность.   -  person Nikita Kurtin    schedule 06.04.2019


Ответы (1)


Довольно простой код, который сделает свое дело, фильтр панели поиска прост, а для раскрывающегося меню я использую сторонний модуль с именем «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()
}
}

введите описание изображения здесь

person Arie Pinto    schedule 10.08.2018
comment
Братан, мне нравится твой ответ, но тебе не хватает searchBar.delegate = self внутри didViewLoad(), он никогда не будет выполняться, если он не для этого - person B. León; 08.12.2018
comment
Неправда, вы можете подключить делегата в раскадровке, что я обычно и делаю. Нет необходимости писать ненужный код - person Arie Pinto; 08.12.2018
comment
Знал ли я это, 3 дня ломал голову, пытаясь получить то, что вы показали, и пробуя другие решения, новые для программирования iOS, кстати - person B. León; 08.12.2018
comment
Ха-ха, извините, хоть что-то новое открыли - person Arie Pinto; 08.12.2018
comment
Большое спасибо, вы сохранили само приложение, еще раз спасибо - person Sakthimuthiah; 09.12.2020