Как заменить содержимое на экране табличным представлением при нажатии UISearchBar - PullRequest
0 голосов
/ 21 января 2020

Я знаю, что раньше были такие вопросы: здесь или здесь

Но это не так подробно, как хотелось бы тем не мение. У меня есть эта страница типа «Изучить» на экране. Он имеет панель поиска в верхней части, и я хотел бы показать содержание / сообщения в средней части. Но когда пользователь нажимает на панель поиска, я хочу, чтобы go на контроллере табличного представления, заменяя содержимое на экране, отображало результаты поиска.

enter image description here

У меня был встроенный контроллер контейнера viewview в контейнере UIView:

import UIKit
import Firebase

class SearchTableViewController: UITableViewController, UISearchResultsUpdating {


let searchController = UISearchController(searchResultsController: nil)
@IBOutlet var searchResultsTableView: UITableView!

var usersArray = [NSDictionary?]()
var filteredIsers = [NSDictionary?]()
var ref = Database.database().reference()

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    ref.child("users").child("public").queryOrdered(byChild: "username").observe(.childAdded, with: { (snapshot) in

        if let user = snapshot.value as? [String:Any]{
            let username = user["username"] as? String ?? ""
            if(username == SpalshScreenViewController.UserData.username){
                return
            }else{
                self.usersArray.append(snapshot.value as? NSDictionary)
            }
        }else{
            return
        }


        print(self.usersArray)

        // insert rows

        self.searchResultsTableView.insertRows(at: [IndexPath(row: self.usersArray.count-1, section: 0)], with: UITableView.RowAnimation.automatic )
    })

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    if searchController.isActive && searchController.searchBar.text != "" {
        return filteredIsers.count
    }else{
        return self.usersArray.count
    }
}

func updateSearchResults(for searchController: UISearchController) {
    filterContent(searchText: self.searchController.searchBar.text!)
}

func filterContent(searchText: String){
    self.filteredIsers = self.usersArray.filter{ user in
        let username = user!["username"] as? String

        return(username?.lowercased().contains(searchText.lowercased()))!
    }
    tableView.reloadData()
}


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

    let user : NSDictionary?

    if searchController.isActive && searchController.searchBar.text != "" {
        user = filteredIsers[indexPath.row]
    }else{
        user = self.usersArray[indexPath.row]
    }

    cell.textLabel?.text = user?["firstName"] as? String
    cell.detailTextLabel?.text = user?["username"] as? String
    let profilePicUrl = user?["profilePicURL"] as? String
    let encodedurl = URL(string: profilePicUrl!)
    print(profilePicUrl)
    cell.imageView!.kf.setImage(with: encodedurl, placeholder: UIImage(named: "profile_pic"))

    return cell
}
}

Должен ли я иметь этот код в отдельном UITableViewController и затем отображать это представление при нажатии на строку поиска или?

Я знаю, что вы изменили бы let searchController = UISearchController(searchResultsController: nil) на что-то вроде let searchController = UISearchController(searchResultsController: tableViewController)

, но я не знаю, как все это сделать ie. В моем searchViewController у меня есть ссылка на UISearchBar, Я думал, что добавлю жест касания и present в представлении tablecontroller при его нажатии, но это будет означать несоответствие в анимации и стиле панели поиска?

EDIT:

Итак, в основном, у меня есть контроллер представления, в этом контроллере представления вверху есть панель поиска (в данный момент ничего не делающая), а под этой панелью поиска будет представление коллекции, заполненное различными сообщениями. Когда пользователь нажимает на панель поиска, я хотел бы заменить это представление коллекции на представление таблицы с результатами результата поиска. Как бы я этого достиг?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Привет, @nathan, объясни, пожалуйста, поподробнее, чем было бы лучше. Другой мудрый на основе моего текущего понимания. Если у вас есть панель поиска, добавленная в верхней части представления, и у вас также есть представление таблицы, вы можете обновить свое представление таблицы в методах делегирования панели поиска. Я разделяю методы делегата панели поиска для вашей помощи.

extension SearchViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    let str = searchText.trimmingCharacters(in: .whitespacesAndNewlines)
        viewModel?.search(text: str)
        tableView.reloadData()
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    if let t = searchBar.text?.trimmingCharacters(in: .whitespacesAndNewlines) {
        if t.count > 0 {
            viewModel?.addNewSearch(text: t)
            tableView.reloadData()
        }
    }
    searchBar.resignFirstResponder()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    viewModel?.cancel()
    navigationController?.popViewController(animated: true)
} }

Я использовал MVVM в своем коде, поэтому ViewModel в основном используется для обновления и изменения данных. Спасибо, вы можете спросить, есть ли у вас путаница.

0 голосов
/ 21 января 2020

Вы должны установить searchResultsController и searchResultsUpdater свойства UISearchController class

В отношении объекта UISearchBar, вы должны использовать тот, который поставляется с UISearchController и программно добавляет его в представление.

view.addSubview(searchController.searchBar)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...