在 Swift 中使用 NSPredicate 显示来自 CoreData 的结果
Display results from CoreData using NSPredicate in Swift
我的 viewDidLoad()
中有以下代码
fetchedResultsController = NSFetchedResultsController(fetchRequest: FetchRequest("Teams", key: "team_name"), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
fetchedResultsController?.performFetch(nil)
我的 TableView cellForRowAtIndex 中的这段代码:
var cell = teamView.dequeueReusableCellWithIdentifier("team_cell", forIndexPath: indexPath) as! TeamCellSettings
if let cellContact = fetchedResultsController?.objectAtIndexPath(indexPath) as? Team {
//create cell here
}
return cell
我已经在线阅读了有关如何使用 NSPredicate 的信息,但我似乎无法让它工作。我的目标是使用分段控件根据行属性的内容在 UITableView 中显示的结果之间切换。因此,如果我的实体 X
有一个名为 A
的属性,A
将存储 1 或 0,所以基本上我需要分段控件在 all 属性 A
中包含 1 或属性 A
中包含 0 的结果
我的创意写作技巧不是最好的。希望你能理解我的目标。谢谢。
需要在fetch请求中加入predicate,例如:
let request = NSFetchRequest(entityName: "Your entity name")
let predicate = NSPredicate(format: "A == %d", 1)
request.predicate = predicate
fetchedResultsController = NSFetchedResultsController(
fetchRequest: request,
managedObjectContext: managedObjectContext!,
sectionNameKeyPath: nil,
cacheName: nil)
谓词的内容取决于您的目标。在下一步中,您将需要更新获取请求并在更改分段控件中的选定项时重新加载数据。在分段控件更改时调用的 IBAction
中,获取 sender.selectedSegmentIndex
并根据索引创建新谓词。
重新获取的代码看起来像这样:
Swift 2
fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "A = %d", some_int_goes_here)
do {
try fetchedResultsController.performFetch()
}
catch let error as NSError {
NSLog("%@", error.localizedDescription)
}
catch {
fatalError()
}
tableView.reloadData()
如果做Swift1.2,省略错误处理,当然是这样的:
fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "A = %d", some_int_goes_here)
fetchedResultsController.performFetch()
tableView.reloadData()
我的 viewDidLoad()
fetchedResultsController = NSFetchedResultsController(fetchRequest: FetchRequest("Teams", key: "team_name"), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
fetchedResultsController?.performFetch(nil)
我的 TableView cellForRowAtIndex 中的这段代码:
var cell = teamView.dequeueReusableCellWithIdentifier("team_cell", forIndexPath: indexPath) as! TeamCellSettings
if let cellContact = fetchedResultsController?.objectAtIndexPath(indexPath) as? Team {
//create cell here
}
return cell
我已经在线阅读了有关如何使用 NSPredicate 的信息,但我似乎无法让它工作。我的目标是使用分段控件根据行属性的内容在 UITableView 中显示的结果之间切换。因此,如果我的实体 X
有一个名为 A
的属性,A
将存储 1 或 0,所以基本上我需要分段控件在 all 属性 A
中包含 1 或属性 A
我的创意写作技巧不是最好的。希望你能理解我的目标。谢谢。
需要在fetch请求中加入predicate,例如:
let request = NSFetchRequest(entityName: "Your entity name")
let predicate = NSPredicate(format: "A == %d", 1)
request.predicate = predicate
fetchedResultsController = NSFetchedResultsController(
fetchRequest: request,
managedObjectContext: managedObjectContext!,
sectionNameKeyPath: nil,
cacheName: nil)
谓词的内容取决于您的目标。在下一步中,您将需要更新获取请求并在更改分段控件中的选定项时重新加载数据。在分段控件更改时调用的 IBAction
中,获取 sender.selectedSegmentIndex
并根据索引创建新谓词。
重新获取的代码看起来像这样:
Swift 2
fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "A = %d", some_int_goes_here)
do {
try fetchedResultsController.performFetch()
}
catch let error as NSError {
NSLog("%@", error.localizedDescription)
}
catch {
fatalError()
}
tableView.reloadData()
如果做Swift1.2,省略错误处理,当然是这样的:
fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "A = %d", some_int_goes_here)
fetchedResultsController.performFetch()
tableView.reloadData()