ios - 在 Swift 核心数据项目中实现 UISearchController

标签 ios core-data nsmanagedobject nsmanagedobjectcontext

我目前正在学习 iOS 开发类(class)。作为作业的一部分,我的任务是使用 Swift 中的 Core Data 在笔记跟踪项目中创建一个 UISearchController

我发现的每个示例都在 Objective-C 中,或者正在过滤静态数组。 Apple 的“示例”代码于 2014 年 12 月更新,无法在 Xcode 6.3 中编译。

要添加 UISearchController,我有 3 个主要任务要做:

1) 创建一个 View Controller 来显示搜索结果。我正在使用 TableViewController。

2) 创建一个 UISearchController,并将它传递给我的搜索结果 View Controller 。

现在“难倒”我的是获取 managedObjectsContext 中的对象。在尝试添加 UISearchController 之前,我的应用程序运行良好。我可以添加、编辑和删除项目。我在 Xcode 6.3 中使用“ jar 装”Core Data 代码,在 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的类)。我正在使用我的搜索结果 View Controller 实现此协议(protocol),以便我可以更新过滤后的结果。

下面是我的 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])
}

}

最佳答案

有两种设置上下文的方法:

回调 App Delegate:,像这样

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

或者将上下文向前传递从App Delegate到Master View Controller,然后主视图 Controller 将它传递到任何后续的 View Controller ,等等。每个 View Controller 都需要为上下文定义一个属性;当一个新的 VC 被实例化时,上下文在 VC 被呈现/推送之前设置,例如:

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

并且,当加载一个新的 View Controller 时,

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

要访问对象,请使用 NSFetchRequestNSFetchedResultsController 创建一个结果数组,然后您可以将其传递给 resultsController。例如。对于获取请求:

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

(您的 notes() 函数在错误的轨道上 - 您不会使用 NSArray(contentsOfFile:) 来访问 CoreData 对象。此外,您必须为 NSManagedObject 子类使用指定的初始化程序:所以不是 var note = Notes () 但是 var note = Notes(entity: NSEntityDescription, insertIntoManagedObjectContext: NSManagedObjectContext?)

关于ios - 在 Swift 核心数据项目中实现 UISearchController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658607/

相关文章:

cocoa - 除了在 *.h 文件中的接口(interface)中声明之外,如何使从 NSManagedObject 子类化的对象的选择器对编译器可见?

objective-c - Objective-C - NSManagedObjectContext 和 NSFetchedResultsController 释放处理

ios - 读取特定 NSManagedProperty 后释放 NSManagedObject 时,NSPersistentStoreCoordinator 会抛出 EXC_BAD_ACCESS

ios - 在Salesforce中获取Http请求的JSON正文

ios - UITableView 和 NSFetchedResultsController 内存泄漏

NSManagedObject 的 Date 与 NSDate 的 Xcode 9 构建问题

swift - 无法调用 NSManagedObject 类上的指定初始化程序 -- CoreData

ios - Flutter:在iOS上第二次使用image_picker从图片库中选择照片 'Lost connection to device.'

android - 在 Android 和 iOS 应用程序与用户日历之间同步日历事件?

ios - UIActivityViewController 将 sourceView 设置为 UIBarButtonItem