私は 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()
}
}