2015-08-18 2 views
2

Я ищу достойное решение этой проблемы. Я хочу реализовать некоторые простые функции поиска в TableView, которые у меня есть.Swift Использование NSFetchedResultsController и UISearchBarDelegate

Все примеры, которые я нашел либо использовать устаревшую UISearchDisplayController или использовать новый UISearchController но без NSFetchedResultsController В настоящее время это заселенной с помощью Core Data/NSFetchedResultsController

До сих пор мне удалось получить его до точки, где я могу собрать строку поиска пользователей (woo!). Я знаю, что для выполнения поиска мне может понадобиться отдельный FRC, но, как упоминалось выше, все попытки до сих пор потерпели неудачу.

Мой класс в соответствии со следующими протоколами:

class JobListController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate, UISearchBarDelegate{ 

Я не могу использовать UITableViewController, как я уже писал нагрузок существующей функциональности, которая опирается на этот класс, являющийся UIViewController У меня есть два IBOutlets:

@IBOutlet var tblJobs : UITableView! 
@IBOutlet weak var searchBar: UISearchBar! 

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

var workItems = [Work]() 
var filteredWorkItems = [Work]() 

Вот как я инициализация моей FRC, вместе с моим MOC и я оставил в моем пустом втором FRC как я совершенно уверен, что это будет необходимо в каком-то момент:

let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

lazy var fetchedResultsController: NSFetchedResultsController = { 
    let workFetchRequest = NSFetchRequest(entityName: "Work") 
    let primarySortDescriptor = NSSortDescriptor(key: "createdDate", ascending: true) 
    let secondarySortDescriptor = NSSortDescriptor(key: "town", ascending: true) 
    workFetchRequest.sortDescriptors = [primarySortDescriptor, secondarySortDescriptor] 

    let frc = NSFetchedResultsController(
     fetchRequest: workFetchRequest, 
     managedObjectContext: self.managedObjectContext!, 
     sectionNameKeyPath: "createdDate", 
     cacheName: nil) 

    frc.delegate = self 


    return frc 
    }() 

var searchResultsController: NSFetchedResultsController? 

В моем viewDidLoad функции Я настройка/источник делегатов данных для моей таблицы и SearchBar:

tblJobs.delegate = self 
    tblJobs.dataSource = self 
    searchBar.delegate = self 

и здесь есть searchBar функции, где я до. Переменная stringMatch осталась в стороне от предыдущей попытки, я надеюсь, что у меня будет возможность поиска по множеству различных параметров здесь, но если я смогу получить только одну рабочую, это будет твердый старт.

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    println("Search text is \(searchText)") 
    self.filteredWorkItems = self.workItems.filter({(work: Work) -> Bool in 
     // 
     let stringMatch = work.postcode.rangeOfString(searchText) 
     return stringMatch != nil 
    }) 

    if(filteredWorkItems.count == 0){ 
     searchActive = false; 
    } else { 
     searchActive = true; 
    } 
    self.tblJobs.reloadData() 
} 

Вот моя cellForRowAtIndexPath функции, чтобы показать, как я потянув данные из fetchedResultsController

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 
    let cell = self.tblJobs.dequeueReusableCellWithIdentifier(
     "JobCell", forIndexPath: indexPath) 
     as! JobTableViewCell 

    let workItem = fetchedResultsController.objectAtIndexPath(indexPath) as! Work 



//... 

    return cell 
} 

Таким образом, вы можете видеть, у меня есть несколько вещей, которые здесь происходят, в конце концов я хотел фигуры как я использую свою недавно полученную строку searchText для запроса к моему FRC, а затем для правильного фильтра в представлении.

Update:

Я попытался добавить строку поиска в моей NSPredicate в FRC так:

lazy var fetchedResultsController: NSFetchedResultsController = { 

    ../ 


    workFetchRequest.predicate = NSPredicate(format:"title contains[cd] %@", savedSearchTerm!) 

    //... 
    return frc 
    }() 

Какие результаты в 'JobListController.Type' does not have a member named 'savedSearchTerm'

В верхней части моего класса Я установил его следующим образом:

var savedSearchTerm: NSString? 

Так что не уверен, что я делаю неправильно?

ответ

7

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

Сохраните поисковый запрос в переменной. В функции заводской FRC, включают предикат, что-то вроде этого:

request.predicate = searchText?.characters.count > 0 ? 
NSPredicate(format:"title contains[cd] %@", searchText!) : nil 

При изменении текста, сброс FRC и перезагрузить.

fetchedResultsController = nil 
tableView.reloadData() 

Если у вас есть дополнительные фильтры, такие как кнопки сферы, добавьте дополнительные термины в предикат.

+0

Есть ли какие-либо преимущества при использовании отдельного вида таблицы? Я не могу представить, как будет работать отдельный просмотр таблицы? – dyatesupnorth

+1

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

+0

У меня есть несколько проблем с этим, во-первых, я не могу получить доступ к моей переменной searchTerm изнутри моего lazy var fetchedResultsController, также я не могу установить этот fetchedResultsController на nil – dyatesupnorth

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