如何使用带有Core数据生成的tabel视图的搜索栏控制器 - Swift?

时间:2016-01-21 23:46:11

标签: ios swift uitableview core-data uisearchbardisplaycontrol

我是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() 
        }
    }

0 个答案:

没有答案