2016-06-06 6 views
2

Я попытался внедрить UISearchController в свой ViewController. Тем не менее, когда я пытаюсь открыть контроллер с помощью кнопки, он сбрасывает приложение и нет ошибки, данной мне из Xcode. Я использую Backendless для хранения пользователей и их восстановления. Я хочу найти их. Вот мой код. Я не знаю, что я делаю неправильно:/Я очень благодарен за помощь.Сбой при сбое UISearchController

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)") 
    } 

} 

} 
+0

Добавить контрольную точку исключения, чтобы проверить, что произошло. –

+0

Считается, что Thread 1: EXC_BAD_INSTRUCTION для 'if resultSearchController.active' и Thread 1: Signal SIGABRT после того, как я удалю его в' классе AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {'@EvgenyKarkan –

ответ

2

Ваш 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 
+0

Он по-прежнему сбой:/Вот обновленный код: http://pastebin.com/Vqwm3Cf8 @ILikeTau –

+0

Такое же сообщение об ошибке? –

+0

@NathanModern Я предполагаю, что вы получили его на работу? –

Смежные вопросы