1

私は iOS 開発に不慣れで、Swift を使用して 2 番目のアプリを使用しています。私のアプリには2つのビューがあります。 最初のビューは、(ユーザーによる) ボタンのクリックでランダムに生成される果物の配列です。最初のビューの出力: [リンゴ、オレンジ、バナナ、ナシ]

ここで、ユーザーはもう一度生成ボタンをクリックします。ビューは、果物のランダムな選択を提供します: [ザクロ、ナシ、スイカ、マスクメロン]

ユーザーがもう一度生成ボタンをクリックすると、配列の新しいリストが生成されます。

これらの生成されたすべての配列は、テーブル ビュー コントローラーである 2 番目のビューに格納されます。2 番目のビュー コントローラーでの果物の配列の保存は、Core データによって行われます。

ここで、この 2 番目のビューに検索バーと検索表示コントローラーを追加しました。梨と言います。ユーザーが入力すると、テーブルでフィルター処理され、それらの行のみが同じテーブル ビューに表示/フィルター処理されます。

コア データからデータを読み取り/検索/フィルタリングし、検索バー コントローラーを機能させる方法がわかりません。多くの方法を試し、コア データと UI 検索バー コントローラーに関するさまざまな記事を読みましたが、何も役に立ちませんでした。どうすればよいかアドバイスをお願いします。

これまでのところ、私の2番目のView Controller:

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
        }
    }

????????????? どのデリゲート関数を使用する必要がありますか?? どうすれば実装できますか?

私の 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 の値は常に nil です。私は何を間違っていますか?

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