我是iOS开发的新手,我是第二个使用Swift的应用程序。我的应用中有2个视图。 第一个视图是一个带有水果的数组,它是在按钮点击(用户)上随机生成的。 第一视图的输出:[Apple,Orange,Banana,Pears]
现在用户再次点击生成按钮。视图随机选择水果:[石榴,梨,西瓜,甜瓜]
用户再次单击生成按钮,将生成新的数组列表。
所有这些生成的数组都存储在第二视图中,这是一个Table视图控制器。在第二个视图控制器中保存水果数组是由核心数据完成的。
现在,我在第二个视图中添加了一个搜索栏和搜索显示控制器,以便任何水果;说梨;当用户输入的内容在表中被过滤时,只有那些行在同一个表视图中显示/过滤。
我不确定如何从Core数据中读取/搜索/过滤数据并使搜索栏控制器正常工作。 我已经尝试了很多方法并阅读有关核心数据和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
}
}
???????????哪些代理功能应该使用?以及如何实施它?
My Core数据类如下所示: Core Data类名称为Fruits.swift
import UIKit
import CoreData
@objc(Fruits)
class Fruits: NSManagedObject {
@NSManaged var date: String
@NSManaged var fruit: String
}
在第一个视图中,数组通过以下代码保存在Core数据中:
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()
}
}