2015-02-22 6 views
1

В настоящее время я занимаюсь разработкой 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]) 
} 

} 

ответ

2

Есть два подхода к установлению контекста:

Calling обратно в App Делегат:, как этот

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

или Передача контекста вперед из приложения Делегат в Maste r View Controller, который затем передает его на любые последующие контроллеры представлений и т. д. Каждому контроллеру представления потребуется свойство, определенное для контекста; когда новый VC конкретизируется, контекст установлен перед ВК представлен/втягивания, например:

class CustomViewController : UIViewController { 
     var managedObjectContext : NSManagedObjectContext 
     ... 

и, при загрузке нового контроллера вида,

let newVC = CustomViewController() 
    newVC.managedObjectContext = self.managedObjectContext 
    ... 

Для доступа к объектам, используйте либо NSFetchRequest, либо NSFetchedResultsController, чтобы создать массив результатов, с помощью которого вы можете перейти к resultsController. например. для выборки запроса:

let fetch = NSFetchRequest(entityName: "Notes") 
    var error : NSError? = nil 
    let fetchedResults = managedObjectContext?.executeFetchRequest(fetch, error: &error) 

функции (Ваши замечаний() находится на ложном пути - вы бы не использовать NSArray (contentsOfFile :), чтобы получить доступ к объектам CoreData Кроме того, вы должны использовать назначенный Инициализатор для NSManagedObject подклассов.: так что не var note = Notes(), но var note = Notes(entity: NSEntityDescription, insertIntoManagedObjectContext: NSManagedObjectContext?)

+0

Спасибо. Я еще не понял, но это очень полезно. Мне кажется, что я первый человек, который реализует «UISearchController» в проекте Core Data с использованием Swift Думаю, я собираюсь развязать свою ветку и снова начать использовать ваши предложения. Что касается «Шагов», я нахожусь на правильном пути с неправильным синтаксисом? – Adrian

+0

Да, шаги в вашем вопросе выглядят хорошо. Какой шаблон проекта вы использовали? Я думаю, что шаблон Master-Detail работает, передавая контекст из App Delegate и использует NSFetchedResultsController для заполнения основного представления таблицы. Я бы начал с этого шаблона, а затем включил контроллер поиска. – pbasdf

+0

Да. Я использую макет 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

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