Я пытаюсь создать страницу поиска для пользователей, чтобы искать других пользователей по всей базе данных, но приложение продолжает падать - PullRequest
0 голосов
/ 10 июля 2019

Когда я нажимаю кнопку, чтобы перейти на страницу поиска, приложение вылетает и возвращается msgstr "libc ++ abi.dylib: завершается с необработанным исключением типа NSException" Я все еще новичок в кодировании, и я не уверен, что я делаю неправильно

 @IBOutlet weak var SearchTable: UITableView!

    var userArray = [NSDictionary?]()
    var filteredUsers = [NSDictionary?]()

    var dataRef = Database.database().reference()

    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

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

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

            self.userArray.append(snapshot.value as? NSDictionary)

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


        }) { (error) in
            print(error.localizedDescription)
        }

    }

    // 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 {

        if searchController.isActive && searchController.searchBar.text != "" {
            return filteredUsers.count
        }
        return self.userArray.count
    }

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

        let user : NSDictionary?

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

        cell.textLabel?.text = user?["username"] as? String



        return cell
    }

    func updateSearchResults(for searchController: UISearchController) {

        filterContent(searchText: self.searchController.searchBar.text!)

    }

    func filterContent(searchText:String)
    {
        self.filteredUsers = self.userArray.filter{ user in

            let Uname = user!["username"] as? String

            return(Uname?.lowercased().contains(searchText.lowercased()))!

        }

        tableView.reloadData()
    }



}

Я ожидаю, что страница откроется, и у меня есть возможность поиска с помощью панели поиска. сообщение об ошибке я получаю libc ++ abi.dylib: завершается с необработанным исключением типа NSException

1 Ответ

0 голосов
/ 10 июля 2019

Эта проблема не имеет ничего общего с Firebase. Из комментария, который вы написали под своим вопросом, вы вставили это консольное сообщение instantiated view controller with identifier "UIViewController-vhH-By-pea" from storyboard "Main", but didn't get a UITableView.'. Я полагаю, что вы подключили экран UIViewController к раскадровке с классом UITableViewController. Это неправильно, вам нужно изменить свой класс на подкласс UIViewController вместо UITableViewController. Затем установите для него делегат SearchTableView и источник данных.

Итак, ваш класс должен быть:

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, ... {

Затем установите делегат TableView и источник данных на self в методе viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    // ...
    SearchTableView.dataSource = self
    SearchTableView.delegate = self
    // ...
}

Кстати, если ваш контроллер имеет только UITableView в нем и ничего больше, то вы можете рассмотреть возможность использования UITableViewController вместо UIViewController с UITableView. UITableViewController - это, по сути, UIViewController с основным видом на него UITableView, поэтому нет необходимости переделывать всю работу :)

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