2017-11-21 6 views
-1

CoreDataでデータを格納しているTableViewにSearchBarを追加しようとしています。しかし、私が検索しようとすると、TableViewは更新されません。フェッチは機能していると思いますが、テーブルは更新されていません。TableViewのSearchBarが機能しません

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchText.isEmpty { 
     return 
    } 
    else { 
     let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

     let sRequest: NSFetchRequest<Note> = Note.fetchRequest() 
     sRequest.predicate = NSPredicate(format: "SELF.title CONTAINS[cd] %@", searchText) 
     sRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)] 

     let fetchedResultsController = NSFetchedResultsController(fetchRequest: sRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
     print(sRequest) 

     do { 
      try fetchedResultsController.performFetch() 

     } catch { 
      fatalError("Failed to fetch entities: \(error)") 
     } 

     self.mainTable.reloadData() 
    } 
    return 
} 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell:UITableViewCell = mainTable.dequeueReusableCell(withIdentifier: "prototypeCell")! 

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    let tableRequest: NSFetchRequest<Note> = Note.fetchRequest() 
    tableRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)] 

    var fetchedResultsController = NSFetchedResultsController(fetchRequest: tableRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 

    do { 
     try fetchedResultsController.performFetch() 
    } catch { 
     fatalError("Failed to fetch entities: \(error)") 
    } 

    let noteCell = fetchedResultsController.object(at: indexPath) 
    cell.textLabel?.text = noteCell.title! 

    let formatter = DateFormatter() 
    formatter.dateFormat = "d.M.y, HH:mm" 
    let dateString = formatter.string(from: noteCell.date! as Date) 
    cell.detailTextLabel?.text = dateString 

    return cell 
} 
+0

'cellForRowAtIndexPath'のコードを含めることができますか? –

+0

更新:cellForRowAtを追加しました – Abisanth11

答えて

0

問題は、この行です:

let fetchedResultsController = NSFetchedResultsController(... 

letが、これはローカル変数であることを意味します。新しいフェッチされた結果コントローラを作成し、それを放棄します。

一方、あなたのcellForRowAtに、あなたは他のfetchedResultsControllerと呼ばれるものを参照してください。

var fetchedResultsController = ... 

これらは2つの完全に異なるオブジェクトです。

実際にはどちらも間違っています。行を考慮するためにテーブルビューのデータソースが呼び出されるたびに、フェッチを実行しないでください。 Xcodeアプリケーションテンプレートの仕組みを見てください! が取得された結果コントローラが永久にです。一度フェッチしてからデータを保持しています。それがあなたがしなければならないことです。

関連する問題