2015-09-24 4 views
3

Я создал searchController, и поэтому я пытаюсь сделать его фильтром в соответствии с текстом в UISearchController. Я создал пользовательский объект, как показано ниже. Я попытался с помощью NSPredicate, но продолжаю получать:Фильтр по массиву объектов searchController

cannot convert value of type NSPredicate to expected type @noescape (organization) throws...

class Organization: Object { 
    var id: Int = 0 
    var name: String = "" 
    var shortName: String = "" 
    var image: NSData = NSData() 
    var pinImage: NSData = NSData() 
    let locations = List<Location>() 

} 

Тогда у меня есть массив называется sortedLocations в моем ViewController, который содержит ряд Organization объектов.

То, что я пытался до сих пор:

func updateSearchResultsForSearchController(searchController: UISearchController) 
{ 
    filteredTableData.removeAll(keepCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF.name CONTAINS[c] %@", searchController.searchBar.text!) 

    let array = sortedLocations.filter(searchPredicate) 
    filteredTableData = array as! [Organization] 



    self.tableView.reloadData() 
} 

ответ

4

Метод SequenceTypefilter() не принимает NSPredicate в качестве аргумента, а закрытие, например,

let filteredTableData = sortedLocations.filter { 
    $0.name.localizedCaseInsensitiveContainsString(searchText) 
} 

Замыкание вызывается для каждого элемента массива (в данном случае с помощью сокращенную аргумент $0) и возвращает true или false, чтобы указать, если элемент должен быть включен в отфильтрованный результат или нет.


Вы можете использовать NSPredicate для фильтровать NSArray, который будет выглядеть как

let filtered = someNSArray.filteredArrayUsingPredicate(predicate) 

но нет никаких причин, чтобы использовать это, если у вас есть Swift массив.

+0

Хмм, но 'отфильтрованныйTableData', похоже, ничего не содержит, когда я пишу что-то, что содержится в имени объекта? Нужно ли добавлять что-нибудь? –

+0

@PeterPik: Я только дважды проверил его с помощью небольшой тестовой программы, и он работал, как ожидалось. –

+0

, но разве я ничего не добавляю? –