В настоящее время я занимаюсь разработкой iOS. В рамках задания мне поручено создать UISearchController
в проекте отслеживания заметок с использованием Core Data в Swift.Внедрение UISearchController в проекте Swift Core Data
Каждый пример, который я нашел, находится в Objective-C или фильтрует статический массив. Код «образца» Apple, обновленный в декабре 2014 года, не компилируется в Xcode 6.3.
Чтобы добавить UISearchController
, я получил 3 основные задачи сделать:
1) Создание контроллера вида для представления результатов поиска. Я использую TableViewController.
2) Создайте UISearchController и передайте ему свой контроллер представления результатов поиска.
Что меня «забивает», теперь нужно ухватить объекты в управляемом объекте. Прежде чем пытаться добавить UISearchController
, мое приложение работает нормально. Я могу добавлять, редактировать и удалять элементы. Я использую «законсервированный» код основных данных в Xcode 6.3 со стеком в AppDelegate.
class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate
var searchController: UISearchController? = nil
func addSearchBar() {
var resultsController = SearchResultsTableViewController()
resultsController.notes = // stumped what to call the notes. Trying to call an array from the Notes class below
resultsController.delegate = self
searchController = UISearchController(searchResultsController: resultsController)
searchController!.searchResultsUpdater = resultsController
searchController!.searchBar.frame = CGRect(
x: searchController!.searchBar.frame.origin.x,
y: searchController!.searchBar.frame.origin.y, width: searchController!.searchBar.frame.size.width, height: 44.0)
tableView.tableHeaderView = searchController!.searchBar
self.definesPresentationContext = true
}
3) UISearchController уведомит его searchResultsUpdater (класс, который соответствует UISearchResultsUpdating), когда поиск изменения текста. Я использую свой контроллер представлений результатов поиска, реализуя этот протокол, чтобы я мог обновлять отфильтрованные результаты.
Ниже мой Note: NSManagedObject
класс:
import Foundation
import CoreData
class Note: NSManagedObject {
@NSManaged var dateCreated: NSDate
@NSManaged var dateEdited: NSDate
@NSManaged var noteTitle: String
@NSManaged var noteBody: String
// TODO: adding this to make it easier to handle names
class func notes() -> NSArray {
let whereMyNotesAreStored = // Need syntax for where my MyManagedObjectContext is located
let dataArray = NSArray(contentsOfFile: whereMyNotesAreStored!)
var notesArray = NSMutableArray()
for dictionary in dataArray {
var note = Note()
note.noteTitle = dictionary["noteTitle"] as! String
note.noteBody = dictionary["noteBody"] as! String
note.dateCreated = dictionary["dateCreated"] as! String
note.dateEdited = dictionary["dateEdited"] as! String
notesArray.addObject(note)
}
return NSArray(array: notesArray as! [AnyObject])
}
}
Спасибо. Я еще не понял, но это очень полезно. Мне кажется, что я первый человек, который реализует «UISearchController» в проекте Core Data с использованием Swift Думаю, я собираюсь развязать свою ветку и снова начать использовать ваши предложения. Что касается «Шагов», я нахожусь на правильном пути с неправильным синтаксисом? – Adrian
Да, шаги в вашем вопросе выглядят хорошо. Какой шаблон проекта вы использовали? Я думаю, что шаблон Master-Detail работает, передавая контекст из App Delegate и использует NSFetchedResultsController для заполнения основного представления таблицы. Я бы начал с этого шаблона, а затем включил контроллер поиска. – pbasdf
Да. Я использую макет VC Master-Detail. Я выбираю [образец кода Apple] (https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Listings/TableSearch_swift_TableSearch_swift_MainTableViewController_swift.html#//apple_ref/doc/uid/TP40014683-TableSearch_swift_TableSearch_swift_MainTableViewController_swift-DontLinkElementID_21) (не компилируется, пробивая его «вручную») также ссылается на массив «продуктов». Я думаю, мне все еще нужно создать массив «Notes», содержащийся в файле managedObjectContext, который можно вызвать как метод класса. – Adrian