我是 iOS 开发的新手,正在使用 Swift 开发我的第二个应用程序。我的应用中有 2 个视图。 第一个视图是一个带有水果的数组,它是在按钮单击时随机生成的(由用户)。第一个视图的输出:[Apple、Orange、Banana、Pears]
现在用户再次单击生成按钮。视图提供随机选择的水果:[石榴、梨、西瓜、香瓜]
用户再次单击生成按钮并生成新的数组列表。
所有这些生成的数组都存储在第二个视图中,它是一个表视图控制器。在第二个视图控制器中保存水果数组是由核心数据完成的。
现在,我在第二个视图中添加了一个搜索栏和搜索显示控制器,以便任何水果;说梨;当用户输入时,在表格中被过滤,并且只有那些行在同一个表格视图中显示/过滤。
我不确定如何从核心数据中读取/搜索/过滤数据并使搜索栏控制器工作。我尝试了很多方法并阅读了有关核心数据和 UI 搜索栏控制器的各种文章,但没有任何帮助。请建议我如何进行。
到目前为止,我的第二个视图控制器:
import UIKit
import CoreData
import Foundation
class HistoryTableViewController: UITableViewController {
var totalGeneratedFruits: Int = 0
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let managedObjectContext: NSManagedObjectContext? = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
var arrayFiltered = [Fruits]() // SHOULD THE SEARCH ARRAY BE LIKE THIS???
@IBOutlet weak var searchBar: UISearchBar! // UISearch Bar Controller
@IBOutlet var tblHistory: UITableView! = nil // The Table view controller
override func viewDidLoad()
{
super.viewDidLoad()
var request = NSFetchRequest(entityName: "Fruits")
request.returnsObjectsAsFaults = false
totalGeneratedFruits = context.countForFetchRequest(request, error: nil )
//for search
????????HOW to Overload search filtered data???????
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return totalGeneratedFruits
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: (NSIndexPath!)) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
let request = NSFetchRequest(entityName: "Fruits")
request.returnsObjectsAsFaults = false
//Get the contents of Generated fruits and put into cell to build History Table view rows
var results : NSArray
do {
results = try context.executeFetchRequest(request)
let thisFruit = results[indexPath.row] as! Fruits
cell.textLabel?.text = thisFruit.fruit
cell.detailTextLabel?.text = thisFruit.date // As Subtitle
//For search criteria
????????HOW TO SEARCH and FILTER data???????
}
}catch {}
return cell
}
// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
}
?????????? 应该使用哪个代理函数?以及如何实施?
我的核心数据类看起来像:核心数据类名称是 Fruits.swift
import UIKit
import CoreData
@objc(Fruits)
class Fruits: NSManagedObject {
@NSManaged var date: String
@NSManaged var fruit: String
}
在第一个视图中,数组通过以下代码保存在核心数据中:
let newFruit = Fruits(entity: ent!, insertIntoManagedObjectContext: context)
newFruit.fruit = displayLabel.text!
newFruit.date = dateFormatter.stringFromDate(NSDate())
do {
try context.save()
}catch{}
经过几项研究后,我为搜索功能添加了以下方法来过滤数据。但是 PREDICATE 中的值始终为零。我究竟做错了什么?
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if !searchText.isEmpty {
fetchedResultsController = nil
var predicate: NSPredicate = NSPredicate()
predicate = NSPredicate(format: "fruit contains [cd] %@", searchBar.text!)
let sortDescriptor = NSSortDescriptor(key: "fruit", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
fetchedResultsController?.fetchRequest.predicate = predicate
print(fetchedResultsController?.fetchRequest.predicate)
// HERE THE fetchedResultsController?.fetchRequest.predicate is ALWAYS NIL
do {
try fetchedResultsController?.performFetch()
}catch{}
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
tableView.reloadData()
}
}