我的视图控制器的代码如下所示。
tableview正在从核心数据加载数据。
我在viewcontroller中添加了一个搜索栏。任何人都可以帮我实现搜索?我很困惑看教程。请问任何人都可以为此提供解决方案
import UIKit
import CoreData
class NotesListTableViewController: UITableViewController ,UISearchBarDelegate
{
@IBOutlet weak var searchBar: UISearchBar!
var managedObjectContext : NSManagedObjectContext!
var entries: [NSManagedObject]!
override func viewDidLoad()
{
super.viewDidLoad()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
managedObjectContext = appDelegate.managedObjectContext
//self.fetchEntries()
// makes the searchbar stay in the current screen and not spill into the next screen
definesPresentationContext = true
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.entries.count
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("NotesCell", forIndexPath: indexPath)
// Configure the cell...
let entry1 = entries[indexPath.row]
cell.textLabel?.text = entry1.valueForKey("entry_title") as? String
let imageData2 = entry1.valueForKey("entry_image") as? NSData
if let imageData2 = imageData2
{
let myimage = UIImage(data:imageData2,scale:1.0)
cell.imageView?.image = myimage
}
return cell
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if segue.identifier! == "showNote"
{
let detailDisplay = segue.destinationViewController as! DetailDisplayViewController
let selectedIndexPath = tableView.indexPathForSelectedRow!
let entry = entries[selectedIndexPath.row]
detailDisplay.entry = entry
}
}
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
{
let entry1 = self.entries[indexPath.row]
self.managedObjectContext.deleteObject(entry1)
self.entries.removeAtIndex(indexPath.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
do
{
try managedObjectContext.save()
} catch {
print ("could not save the new entry ")
}
}
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
self.fetchEntries()
}
func fetchEntries()
{
let fetchRequest = NSFetchRequest(entityName:"Entry")
do {
let entryObjects = try managedObjectContext.executeFetchRequest(fetchRequest)
self.entries = entryObjects as! [NSManagedObject]
}catch let error as NSError
{
print ("could not save the new entry \(error.description) ")
}
tableView.reloadData()
}
}
答案 0 :(得分:0)
//你需要维护两个数组,试试这个
func fetchEntries()
{
let fetchRequest = NSFetchRequest(entityName:"Entry")
do {
let entryObjects = try managedObjectContext.executeFetchRequest(fetchRequest)
self.entries = entryObjects as! [NSManagedObject]
}catch let error as NSError
{
print ("could not save the new entry \(error.description) ")
}
self.arrOriginalList = self.entries
tableView.reloadData()
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[searchBar resignFirstResponder];
self.entries = [NSMutableArray arrayWithArray:self.arrOriginalList];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entry_title.lowercaseString BEGINSWITH[C] %@", [searchBar.text lowercaseString]];
self.entries= [NSMutableArray arrayWithArray:[self.entries filteredArrayUsingPredicate:predicate]
];
if([searchBar.text isEqualToString:@""]){
self.entries = [NSMutableArray arrayWithArray:self.arrOriginalList];
}
[tableView reloadData];
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
if([searchBar.text isEqualToString:@""]){
self.entries = [NSMutableArray arrayWithArray:self.arrOriginalList];
[tableView reloadData];
}
}
答案 1 :(得分:0)
//快速尝试这样
func fetchEntries()
{
let fetchRequest = NSFetchRequest(entityName:"Entry")
do {
let entryObjects = try managedObjectContext.executeFetchRequest(fetchRequest)
self.entries = entryObjects as! [NSManagedObject]
}catch let error as NSError
{
print ("could not save the new entry \(error.description) ")
}
self.arrOriginalList = self.entries
tableView.reloadData()
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchBar.resignFirstResponder()
self.entries = NSMutableArray(array:self.arrOriginalList)
let predicate: NSPredicate = NSPredicate(format:"entry_title.lowercaseString BEGINSWITH[C] %@", searchBar.text!.lowercaseString)
self.entries= NSMutableArray(array:self.entries.filteredArrayUsingPredicate(predicate))
if searchBar.text == "" {
self.entries = NSMutableArray(array:self.arrOriginalList)
}
tableView.reloadData()
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == "" {
self.entries = NSMutableArray(array:self.arrOriginalList)
tableView.reloadData()
}
}