我试图创建一个搜索页面供用户搜索整个数据库中的其他用户,但应用程序不断崩溃

时间:2019-07-10 01:35:08

标签: swift firebase firebase-realtime-database firebase-authentication

当我按下按钮进入搜索页面时,应用程序崩溃并返回 “ 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 :(得分:0)

此问题与Firebase无关。从您在问题下所写的评论中,您粘贴了此控制台消息instantiated view controller with identifier "UIViewController-vhH-By-pea" from storyboard "Main", but didn't get a UITableView.'。我相信您已经通过一个UIViewController类从情节提要中连接了一个UITableViewController屏幕。这是错误的,您需要将您的类更改为UIViewController而不是UITableViewController的子类。然后,将SearchTableView的委托和dataSource设置为它。

因此,您的课程应该是:

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

然后在self方法中将TableView的委托和dataSource设置为viewDidLoad

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

顺便说一句,如果您的控制器中只有UITableView,而没有其他内容,那么您可能要考虑使用UITableViewController而不是UIViewController和{{ 1}}。 UITableView本质上是UITableViewController,其中UIViewController是其主要视图,因此无需重做所有工作:)