在 Swift Core Data 项目中实现 UISearchController

Posted

技术标签:

【中文标题】在 Swift Core Data 项目中实现 UISearchController【英文标题】:Implementing a UISearchController in Swift Core Data Project 【发布时间】:2015-02-22 13:55:45 【问题描述】:

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

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

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

1) 创建一个视图控制器来呈现搜索结果。我正在使用 TableViewController。

2) 创建一个 UISearchController,并将其传递给我的搜索结果视图控制器。

现在让我“难过”的是获取 managedObjectsContext 中的对象。在尝试添加 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])



【问题讨论】:

【参考方案1】:

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

回调 App Delegate:,像这样

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

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

    class CustomViewController : UIViewController 
        var managedObjectContext : NSManagedObjectContext
        ...

并且,当加载一个新的视图控制器时,

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

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

    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?)

【讨论】:

谢谢。我还没有完全弄清楚,但这非常有帮助。感觉就像我是第一个使用 Swift 在 Core Data 项目中实现 UISearchController 的人。我想我要核对我的分支并重新开始采纳你的建议。就“步骤”而言,我是否在正确的道路上使用错误的语法? 是的,您问题中的步骤看起来不错。您使用了哪个项目模板?我认为 Master-Detail 模板通过从 App Delegate 向前传递上下文来工作,并使用 NSFetchedResultsController 来填充主表视图。我将从该模板开始,然后合并搜索控制器。 是的。我正在使用 Master-Detail VC 布局。我正在挑选Apple's sample code(不编译,“手动”打孔)还引用了一组“产品”。我想我仍然需要创建一个包含在 managedObjectContext 中的“Notes”数组,我可以将其作为类方法调用。

以上是关于在 Swift Core Data 项目中实现 UISearchController的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 项目中实现侧滑菜单-利用 SWRevealViewController

如何在 Swift 中的 Core Data 中保存多个项目

在 Swift 中实现 Google Play 游戏服务

试图在 swift 3 框架中实现 JWPlayer

试图在 swift 3 框架中实现 JWPlayer

在 ASP.Net Core 中实现 ADO 连接