2015-03-28 3 views
2

Я разрабатываю с помощью xcode 6.2 в ios8 и swift, я пытаюсь реализовать UISearchController внутри UITableViewController, который может быть обновлен после поиска, я написал простой код, чтобы проверить, работает ли он, но когда я компиляции, панель поиска есть, но когда я ввожу текст и нажмите поиск, ничего не происходит:UISearchController не обновляется

вот мой код:

import UIKit 

class searchresult: UITableViewController,UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating { 

    var result:[String] = ["a","b","c"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var searchcon = UISearchController(searchResultsController: self) 
     searchcon.delegate = self 
     searchcon.searchBar.delegate = self 
     searchcon.searchBar.sizeToFit() 
     self.tableView.tableHeaderView = searchcon.searchBar 
     searchcon.searchResultsUpdater = self 
     searchcon.searchBar.showsSearchResultsButton = true 
     self.definesPresentationContext = true 
     searchcon.dimsBackgroundDuringPresentation = false 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell 
     cell.textLabel!.text = result[indexPath.row] 
     return cell 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return result.count 
    } 


    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 


    func updateSearchResultsForSearchController(searchController: UISearchController) { 

     println("updating") 
     result = ["1"] 
     self.tableView.reloadData() 
    } 
} 
+2

Просто попробуйте изменить '' self' к nil' в 'вар searchcon = UISearchController (searchResultsController: само)', потому что он пытается создайте новый 'searchResultsController', чтобы отобразить результаты –

ответ

-1

Попробуйте этот код с другими вещами в как есть.

class searchresult: UITableViewController {  

var searchcon = UISearchController(searchResultsController: nil) 

searchcon.searchResultsUpdater = self 
searchcon.searchBar.sizeToFit() 
self.tableView.tableHeaderView = searchcon.searchBar 
searchcon.searchBar.showsSearchResultsButton = true 
self.definesPresentationContext = true 
searchcon.dimsBackgroundDuringPresentation = false 
} 
2

Как сказал Praveen Говда IV, вы хотите изменить searchResultsController от self к nil. Кроме того, необходимо объявить searchcon вне viewDidLoad:

var searchcon = UISearchController(searchResultsController: nil) 

override func viewDidLoad() { 
    // your implementation 
} 

Однако поведение вы получаете может быть не то, что вы хотите, потому что updateSearchResultsForSearchController вызывается перед поиском:

Called когда панель поиска становится первый ответчик или когда пользователь вносит изменения в панель поиска. (Apple)

+0

Это работает, но я не совсем понимаю, почему мне нужно инициализировать поиск за пределами viewdidload, не могли бы вы объяснить? –

+0

Извините, я имел в виду «объявить», а не «инициализировать». Ваш код не работает из-за [ARC] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html). Он избавляется от вашего 'searchcon', как только' viewDidAppear' завершается, поэтому к тому времени что-то обновляет объект. Чтобы проверить это, создайте подкласс 'UISearchController' и реализуйте метод' deinit', чтобы он печатал сообщение. Сделайте 'searchcon' для экземпляра этого подкласса. Теперь вы можете легко узнать, когда умрет ваш объект. –

0

Как я предложил в моем комментарии, вам необходимо изменить self к null в инициализации UISearchController.

override func viewDidLoad() { 

    super.viewDidLoad() 

    var searchcon = UISearchController(searchResultsController: nil) 
    searchcon.delegate = self 
    searchcon.searchBar.delegate = self 
    searchcon.searchBar.sizeToFit() 
    self.tableView.tableHeaderView = searchcon.searchBar 
    searchcon.searchResultsUpdater = self 
    searchcon.searchBar.showsSearchResultsButton = true 
    self.definesPresentationContext = true 
    searchcon.dimsBackgroundDuringPresentation = false 

} 

Что user3694363 говорит о updateSearchResultsForSearchController вызывался еще до того, текст изменен, является правильным. Но вы можете следовать ниже трюк, чтобы предотвратить делать что-либо, когда он становится первым ответчиком

func updateSearchResultsForSearchController(searchController: UISearchController) { 

     // No need to update anything if we're being dismissed. 
     if !searchController.active { 
      return 
     } 

     // do the filtering here 
    } 
Смежные вопросы