Ios 在Swift核心数据项目中实现UISearchController
我目前正在学习iOS开发课程。作为任务的一部分,我的任务是使用Swift中的核心数据在笔记跟踪项目中创建一个Ios 在Swift核心数据项目中实现UISearchController,ios,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我目前正在学习iOS开发课程。作为任务的一部分,我的任务是使用Swift中的核心数据在笔记跟踪项目中创建一个UISearchController 我发现的每个示例都在Objective-C中,或者正在过滤静态数组。2014年12月更新的苹果“示例”代码没有在Xcode 6.3中编译 要添加一个UISearchController,我有三个主要任务要做: 1) 创建视图控制器以显示搜索结果。我正在使用TableViewController 2) 创建UISearchController,并将其传递
UISearchController
我发现的每个示例都在Objective-C中,或者正在过滤静态数组。2014年12月更新的苹果“示例”代码没有在Xcode 6.3中编译
要添加一个UISearchController
,我有三个主要任务要做:
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将通知其SearchResultsUpdate(符合UISearchResultsUpdate的类)。我正在使用我的搜索结果视图控制器实现此协议,以便更新筛选结果
下面是我的注意: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])
}
}
设置上下文有两种方法: 调用应用程序代理:,如下所示
let appDelegate : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context = appDelegate.managedObjectContext!
或将上下文从应用程序委托向前传递到主视图控制器,然后主视图控制器将其传递到任何后续视图控制器等。每个视图控制器都需要为上下文定义一个属性;实例化新VC时,在呈现/推送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)
(您的notes()函数走错了方向-您不会使用NSArray(contentsOfFile:)访问CoreData对象。此外,您必须为NSManagedObject子类使用指定的初始化器:因此不是
var note=notes()
而是var note=notes()(实体:NSEntityDescription,插入ManagedObjectContext:NSManagedObjectContext?)
谢谢。我还没有完全弄明白,但这非常有帮助。感觉上我是第一个使用Swift在核心数据项目中实现UISearchController
的人。我想我要取消我的分支,重新开始,纳入您的建议。在“步骤”方面,我的路径正确吗?语法错误?是的,您问题中的步骤看起来不错。您使用了哪个项目模板?我认为主详细信息模板的工作原理是从应用程序委托向前传递上下文,并使用NSFetchedResultsController填充主表视图。我将从该模板开始,然后导入Corporat搜索控制器。是的。我正在使用一个主-细节VC布局。我正在挑选(不是编译,而是“手工”打孔)也引用了一个“产品”数组。我想我仍然需要创建一个包含在managedObjectContext中的“注释”数组,我可以将其作为类方法调用。