2016-01-13 4 views
0

Я пытаюсь найти функцию поиска в своем приложении. Поиск в основном будет искать пользовательский ввод в классе Parse в бэкэнд.Swift - Search Bar Начальная загрузка

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

class FriendByUsernameTableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate { 

    var friendObject = FriendClass() 

    @IBOutlet weak var searchBar: UISearchBar! 

     var searchActive : Bool = false 
    var data:[PFObject]! 
    var filtered:[PFObject]! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.searchBar.delegate = self 
     search() 
    } 

    func search(searchText: String? = nil){ 

     let query = PFQuery(className: "_User") 
     if(searchText != nil){ 
      query.whereKey("appUsername", containsString: searchText) 
     } 
     query.findObjectsInBackgroundWithBlock { (results, error) -> Void in 
      self.data = results as? [PFObject]! 
      self.tableView.reloadData() 
     } 

    } 


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

    // MARK: - Table view data source 

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if(self.data != nil){ 
      return self.data.count 
     } 
     return 0 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 


     let obj = self.data[indexPath.row] 
     cell.textLabel!.text = obj["appUsername"] as? String 


     return cell 
    } 

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) { 
     searchActive = true; 
    } 

    func searchBarTextDidEndEditing(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
     search(searchText) 
    } 


} 

код основан на этом руководстве: http://shrikar.com/parse-search-in-ios-8-with-swift/

ответ

0

попробуйте добавить

if searchText!.stringByTrimmingCharactersInSet(.whitespaceCharacterSet()) != "" { 
    query.findObjectsInBackgroundWithBlock() 
} 

в вашей функции поиска вместе с блоком конечно.

Таким образом, вы не будете запрашивать, если вы нажмете на панель поиска или вы нажмете кучу пробелов.

Кроме того, если вы не хотите, чтобы пользователи, которые будут отображаться при загрузке, не называйте search() в вашем viewDidLoad()

+0

Это не собирается решить проблему под рукой. Проблема в том, что просмотр загружается с отображением результатов уже там, где я хочу, чтобы он показывал только результаты, когда поле поиска получило имя пользователя –

+0

@ksa_coder См. Мое редактирование. Вызывая 'search()' в 'viewDidLoad()', вы выполняете запрос и загружаете массив с объектами, не сравнивая имя пользователя с searchText, и, следовательно, ваш TableView отобразит всех пользователей в вашем классе пользователей. – NotMe

+0

Привет. Простите за поздний ответ. Пробовал ваш код выше, и это привело к ошибке: фатальная ошибка: неожиданно найденный nil при разворачивании необязательного значения –

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