Я ищу достойное решение этой проблемы. Я хочу реализовать некоторые простые функции поиска в 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?
Так что не уверен, что я делаю неправильно?
Есть ли какие-либо преимущества при использовании отдельного вида таблицы? Я не могу представить, как будет работать отдельный просмотр таблицы? – dyatesupnorth
Обычно это несколько прозрачный наложенный вид таблицы, который наложен. Это может быть полезно, если вы используете пользовательские ячейки, которые не отображают богатые данные в исходном представлении таблицы, но, скажем, только текст, который выполняется поиск. – Mundi
У меня есть несколько проблем с этим, во-первых, я не могу получить доступ к моей переменной searchTerm изнутри моего lazy var fetchedResultsController, также я не могу установить этот fetchedResultsController на nil – dyatesupnorth