选择时 UISearchController 崩溃

UISearchController crash when selected

我试图在我的 ViewController 中实现 UISearchController。但是,当我尝试通过按钮打开控制器时,应用程序崩溃了,Xcode 没有给我任何错误。我正在使用 Backendless 来存储用户并检索它们。我想搜索它们。 这是我的代码。我不知道自己做错了什么:/非常感谢您的帮助。

import UIKit

protocol ChooseUserDelegate {
func chreatChatroom(withUser: BackendlessUser)
}

class ChooseUserViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {

@IBOutlet weak var tableView: UITableView!


var delegate: ChooseUserDelegate!
var users: [BackendlessUser] = []
var filteredUsers = [BackendlessUser]()
var resultSearchController: UISearchController!

override func viewDidLoad() {
    super.viewDidLoad()

    loadUsers()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


//MARK: UITableviewDataSorce
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func updateSearchResultsForSearchController(searchController: UISearchController) {

            self.filteredUsers.removeAll(keepCapacity: false)
    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!);    let array = (self.users as NSArray).filteredArrayUsingPredicate(searchPredicate)
    self.filteredUsers = array as! [BackendlessUser]

    self.tableView.reloadData()
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if resultSearchController.active
    {
    return self.filteredUsers.count
    } else {
    return users.count
    }
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {


    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell?

    if self.resultSearchController.active
    {
        let userFiltered = filteredUsers[indexPath.row]
        cell!.textLabel?.text = userFiltered.name
    } else {
        let user = users[indexPath.row]
        cell!.textLabel?.text = user.name
    }

    return cell!
}


//MARK: UITableviewDelegate
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let user = users[indexPath.row]

    delegate.chreatChatroom(user)

    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    self.dismissViewControllerAnimated(true, completion: nil)
}


//MARK: IBactions
@IBAction func cancelButtonPressed(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}

//MARK: Load Backendless Users

func loadUsers() {

    let whereClause = "objectId != '\(backendless.userService.currentUser.objectId)'"

    let dataQuery = BackendlessDataQuery()
    dataQuery.whereClause = whereClause

    let dataStore = backendless.persistenceService.of(BackendlessUser.ofClass())
    dataStore.find(dataQuery, response: { (users : BackendlessCollection!) -> Void in

        self.users = users.data as! [BackendlessUser]
        self.resultSearchController = UISearchController(searchResultsController: nil)
        self.resultSearchController.searchResultsUpdater = self

        self.resultSearchController.dimsBackgroundDuringPresentation = false
        self.resultSearchController.searchBar.sizeToFit()

        self.tableView.tableHeaderView = self.resultSearchController.searchBar

        self.tableView.reloadData()


        }) { (fault : Fault!) -> Void in
            print("Error, couldnt retrieve users: \(fault)")
    }

}

}

你的resultSearchController在使用前是nil。它设置在一个闭包中,几乎可以肯定 设置视图时需要它。要修复它,只需将此初始化代码移动到更早的位置,例如 viewDidLoad():

self.resultSearchController = UISearchController(searchResultsController: nil)
self.resultSearchController.searchResultsUpdater = self

self.resultSearchController.dimsBackgroundDuringPresentation = false
self.resultSearchController.searchBar.sizeToFit()

self.tableView.tableHeaderView = self.resultSearchController.searchBar