1

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

0 回答 0