Хочу быстро создать панель поиска, такую ​​как Google

У меня есть массив вроде [«яблоко», «появляется», «Азхар», «код», «BCom»] и т. д. Этот массив содержит более полумиллиона записей.

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

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

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

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

этот массив содержит более полумиллиона записей ... Я не думаю, что это правильный подход для этой цели
B001ᛦ 10.08.2018 17:16

Можете ли вы предложить что-нибудь, как это сделать?

Naqeeb Ahmed 11.08.2018 00:27

@NaqeebAhmed какой способ сделать это из теста - Чтобы найти лучший подход, сначала вам нужно задать себе несколько вопросов: (1) Вам действительно нужен такой большой массив? Подумайте, сколько оперативной памяти вы тратите на эти 500 000 строк. (2) Сколько должно быть показано отфильтрованных результатов? Обратите внимание, что в приложениях Google результаты обычно ограничиваются 5-10 результатами, что дает намного лучшую производительность, а затем фильтрует весь массив при каждом событии изменения редактирования. (3) Обратите внимание, что ваш массив - это несортированный «код» перед «BCom», «появляется» перед «Azhar» и т. д. Использование отсортированного массива для поиска может улучшить производительность.

Nikita Kurtin 06.04.2019 09:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
3 982
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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()
}
}

Братан, люблю твой ответ, но тебе не хватает searchBar.delegate = self внутри didViewLoad (), он никогда не выполнится, если не для него

B. León 08.12.2018 01:18

Неправда, вы можете подключить делегата в раскадровке, что я обычно и делаю. Не нужно писать ненужный код

Arie Pinto 08.12.2018 01:21

Если бы я знал это, я уже 3 дня ломал себе голову, пытаясь получить то, что вы показали, и пробовал другие решения, новые для программирования iOs, кстати

B. León 08.12.2018 01:36

Ха-ха, извини, по крайней мере, ты открыл что-то новое

Arie Pinto 08.12.2018 01:45

Большое спасибо, вы сохранили само приложение, еще раз спасибо

Sakthimuthiah 09.12.2020 18:31

Другие вопросы по теме