Пользовательский UISearchBar с использованием TextField

Мне нужно сделать заказ UISearchBar с помощью UITextField. Пытаюсь сделать сам, но ничего не получается. Пожалуйста, напишите код для UITextField, который будет работать как UISearchBar Это код, в котором я использую UISearchBar, но мне нужно изменить его на UITextField

class FoodViewController: UIViewController {

    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
    let tableView = UITableView()
    var foods = [FoodModel]()
    var searchedFoods = [FoodModel]()
    var searching = false



    override func viewDidLoad() {
        super.viewDidLoad()


        fetchFoods()

        self.modalPresentationCapturesStatusBarAppearance = true
        self.view.backgroundColor = UIColor.white
        let controller = UIViewController()


        self.tableView.delegate = self
        self.tableView.dataSource = self
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")


        self.view.addSubview(self.tableView)




        tableView.delegate = self
        tableView.dataSource = self


        let searchBar = UISearchBar(frame: CGRect(x: 0, y: 5, width: 350, height: 40))

        searchBar.searchBarStyle = .minimal
        searchBar.barStyle = .black
        searchBar.delegate = self

        self.view.addSubview(searchBar)



    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.updateLayout(with: self.view.frame.size)
    }

    func updateLayout(with size: CGSize) {
        self.tableView.frame = CGRect.init(x: 0, y: 45, width: size.width, height: 400)

    }

    func fetchFoods() {
        Database.database().reference().child("food").observe(.childAdded) { (snapshot) in
            if let dict = snapshot.value as? [String: AnyObject] {
                let newTitle = dict["title"] as! String
                let exCell = FoodModel(title: newTitle)
                self.foods.append(exCell)
                DispatchQueue.main.async {
                    self.tableView.reloadData()

                }
            }

        }

    }
}




extension FoodViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        if searching {
            let food = searchedFoods[indexPath.item]
            cell.textLabel?.text = food.title
        } else {
            let food = foods[indexPath.item]
            cell.textLabel?.text = food.title
        }
        return cell



    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searching {
            return searchedFoods.count
        } else {
            return foods.count
        }
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            var titleOfFood = String()
            if searching == true {
               titleOfFood = searchedFoods[indexPath.row].title
                 print(titleOfFood)
            } else {
                titleOfFood = foods[indexPath.row].title
                 print(titleOfFood)
            }

        let alertController = UIAlertController(title: "Hello", message: "Message", preferredStyle: .alert)
        let cancel = UIAlertAction(title: "Cancel", style: .default)

        let save = UIAlertAction(title: "Save", style: .cancel) { (action) in
             self.dismiss(animated: true, completion: nil)
        }
        alertController.addTextField { (textField) in
            textField.keyboardType = .numberPad
            textField.borderStyle = .roundedRect
            textField.layer.borderColor = UIColor.clear.cgColor
            textField.addConstraint(textField.heightAnchor.constraint(equalToConstant: 50))
            textField.font = UIFont(name: "Roboto-Medium", size: 30)
           // textField.cornerRadius = 8

        }
        alertController.addAction(save)
        alertController.addAction(cancel)
        self.present(alertController, animated: true)
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    }
}

extension FoodViewController: UITableViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView == self.tableView {
            SPStorkController.scrollViewDidScroll(scrollView)
        }
    }
}

extension FoodViewController: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchedFoods = foods.filter({ $0.title.lowercased().prefix(searchText.count) == searchText.lowercased() })
        searching = true
        tableView.isHidden = false
        tableView.reloadData()

        let transitionDelegate = SPStorkTransitioningDelegate()

        transitionDelegate.customHeight = 620
        transitionDelegate.showIndicator = false
    }


    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searching = false
        searchBar.text = ""
        tableView.reloadData()
    }

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

Ответы 1

Ответ принят как подходящий

В основном (если я вас правильно понимаю) после того, как вы добавите свой UITextField в представление, все, что вам нужно, это какой-то метод, который будет запускаться всякий раз, когда значение UITextField изменяется.

Что-то вроде этого:

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

А потом:

func textFieldDidChange(_ textField: UITextField) {
    let searchText = textField.text!
    searchedFoods = foods.filter({ $0.title.lowercased().prefix(searchText.count) == searchText.lowercased() })
    searching = true
    tableView.isHidden = false
    tableView.reloadData()

    let transitionDelegate = SPStorkTransitioningDelegate()

    transitionDelegate.customHeight = 620
    transitionDelegate.showIndicator = false
}

Спасибо ! У меня есть вопрос. Знаете ли вы, как изменить высоту в SPtorkController. Например, у меня есть FirstVC, нажмите кнопку и откройте SPStorkController. И сделать высоту transitionDelegate.customHeight = 620. Я знаю, как это сделать. Но что делать, если мне нужно изменить высоту внутри. Внутри моего SPtorkController(FoodVC) у меня есть кнопка/текстовое поле. Когда я нажимаю на него, я хочу изменить высоту. Как это сделать ? Вы знаете ?github.com/ivanvorobei/SPStorkController#custom-height

Stormios 08.06.2019 16:03

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