2015-11-04 1 views
0

Теперь у меня есть UISearchBar (я не добавляю UISearchDisplayController). Теперь мне нужно: когда я наберу несколько слов внутри UISearchBar и нажмите enter, CategoryListViewController должен показать результаты поиска. Если я ничего не вводил в строке поиска, то CategoryListViewController должен отображать все данные. После ввода слов и нажатия кнопки ввода я могу получить введенный текст. Но как показать результаты поиска? (Я использую основные данные для хранения данных). О CategoryListViewController:Как обновить контроллер просмотра, чтобы показать результаты поиска после нажатия кнопки ввода в строке поиска?

import Foundation 
import UIKit 
import CoreData 
class CategoryListViewController: UIViewController,UITableViewDataSource, UITableViewDelegate,UISearchBarDelegate 
{ 


func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    guard let count = resultController?.sections?.count else 
    { 
     return 0 
    } 

    return count 
} 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    if (searchCategory != nil) 
    { 
     return 1 
    } 

     guard let count = resultController?.sections?[section].numberOfObjects 
     else 
     { 
      return 0 
     } 


    return count 
} 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell:UITableViewCell 

    cell = tableView.dequeueReusableCellWithIdentifier("firstrow", forIndexPath: indexPath) 

    if let category = resultController?.objectAtIndexPath(indexPath) as? Category, let title = category.title,let images = category.image 
    { 

     cell.textLabel?.text = title 


     let number = images.count 

     cell.detailTextLabel?.text = "Contains \(number) images" 

    } 

    return cell 
} 
@IBOutlet weak var tableView: UITableView! 


@IBOutlet weak var searchView: UISearchBar! 

func searchBarCancelButtonClicked(searchBar: UISearchBar) 
{ 
    self.view.endEditing(true) 
} 



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    switch segue.identifier { 
    case .Some("catSegue"): 
     let indexPath = tableView.indexPathForSelectedRow! 
     let viewController = segue.destinationViewController as! CatImagesViewController 
     viewController.navigationItem.title = "Cat Images" 

     tableView.deselectRowAtIndexPath(indexPath, animated: false) 

     if let category = resultController?.objectAtIndexPath(indexPath) as? Category, /*let title = category.title,*/ let images = category.image 
     { 

      viewController.target_category = category 
      viewController.number_of_cells = images.count 

     } 


    default: 
     super.prepareForSegue(segue, sender: sender) 
    } 
} 
// MARK: View Life Cycle 
override func viewDidLoad() { 
    super.viewDidLoad() 
    tableView.delegate = self 
    tableView.dataSource = self 
    searchView.delegate = self 

    //-------------------------------- 
    if (searchCategory != nil) 
    { 
     resultController = try? CatService.sharedCatService.catCategories(searchCategory) 
    } 
    else 
    { 
     resultController = try? CatService.sharedCatService.catCategories() 

    } 


} 

func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
    // print("searchText2 \(searchBar.text)") 

    searchCategory = searchBar.text 
    self.viewDidLoad() 
} 

private var searchCategory:String? 
private var resultController: NSFetchedResultsController? 
private var imageController: NSFetchedResultsController? 
} 

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

func catCategories(searchTerm: String? = nil) throws -> NSFetchedResultsController { 
let fetchRequest = NSFetchRequest(entityName: "Category") 

//let fetchRequest = NSFetchRequest(namedEntity: Image.self) 

if let someSearchTerm = searchTerm 
{ 
    fetchRequest.predicate = NSPredicate(format: "title == %@", someSearchTerm) 
    print("somesearchTerm is \(someSearchTerm)") 
} 



fetchRequest.sortDescriptors = [NSSortDescriptor(key:"title",ascending: true)] 

let mainQueueContext = CoreDataService.sharedCoreDataService.mainQueueContext 
let fetchResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: mainQueueContext, sectionNameKeyPath: nil, cacheName: nil) 

try fetchResultsController.performFetch() 
return fetchResultsController 

} 

ответ

1

Я также хотел бы фильтровать «на месте», то есть без использования поиска контроллера и накладку с результаты поиска. Я обычно следую этой схеме.

Вы должны установить предикат запроса на выборку получателя результатов для nil явно, если поисковый запрос равен nil или не имеет содержимого.

fetchRequest.predicate = (someSearchTerm ?? "").characters.count == 0 ? nil : 
    NSPredicate(format:"title BEGINSWITH %@", someSearchTerm!) 

Во-вторых, вам нужно реализовать этот UISearchBarDelegate методу

func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
    searchBar.resignFirstResponder() 
    someSearchTerm = searchBar.text 
    fetchedResultsController.performFetch() 
    tableView.reloadData() 
} 
Смежные вопросы