2017-03-19 22 views
1

私は、日付で区切られたテーブルビュー用のヘッダーを文字列として作成しようとしています。私はコアデータとNSFetchResultsControllerを使用しています。CoreDataの文字列で分割する

私は基本的に、文字列の日付に基づいてイベントを区切るアジェンダを作っています。

私は私のコードは以下の通りですSWIFT 3.

でこれを行う方法をどこにも見つけることができません。

import UIKit 
import CoreData 

class MainVC: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate { 

    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var segControl: UISegmentedControl! 

    var fetchedResultsController: NSFetchedResultsController<Event>! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.delegate = self 
     tableView.dataSource = self 
     //generateTest() 
     attemptFetchRequest() 
    } 


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     if let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath) as? EventCell { 
      configureCell(cell: cell, indexPath: indexPath as NSIndexPath) 
      return cell 
     } 

     return EventCell() 
    } 

    //calling configure cell in this VC too 

    func configureCell(cell: EventCell, indexPath: NSIndexPath) { 
     let event = fetchedResultsController.object(at: indexPath as IndexPath) 
     cell.configureCell(event: event) 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     if let events = fetchedResultsController.fetchedObjects , events.count > 0 { 
      let event = events[indexPath.row] 
      performSegue(withIdentifier: "DetailsVC", sender: event) 
     } 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "DetailsVC" { 
      if let dest = segue.destination as? DetailsVC { 
       if let event = sender as? Event { 
        dest.eventToEdit = event 
       } 
      } 
     } 
    } 



    func numberOfSections(in tableView: UITableView) -> Int { 
     if let sections = fetchedResultsController.sections { 
      return sections.count 
     } 
     return 0 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if let sections = fetchedResultsController.sections { 
      let sectionInfo = sections[section] 
      return sectionInfo.numberOfObjects 
     } 

     return 0 
    } 

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
      //no idea what to do here 
    } 


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     return 126 
    } 

    func attemptFetchRequest() { 
     let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest() 
     let dateSort = NSSortDescriptor(key: "date", ascending: false) //sort by date 
     let tagSort = NSSortDescriptor(key: "tag", ascending: false) //sort by tag 


     if segControl.selectedSegmentIndex == 0 { 
      fetchRequest.sortDescriptors = [dateSort] 
     } else { 
      fetchRequest.sortDescriptors = [tagSort] 
     } 

     let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 

     controller.delegate = self 

     self.fetchedResultsController = controller 

     do { 
      try fetchedResultsController.performFetch() 
     } catch { 
      let err = error as NSError 
      print("\(err)") 
     } 
    } 
} 

Here is my core data entities, date and tag are both strings

あなたは私が(私のattemptFetchに日付でソートしています見ることができるように)funcですが、どのように日付別にテーブルビューに分割しますか?

ありがとうございます。

EDIT !!!

私はそれを修正しました。コンテンツは正しいセクションに保存されていますが、テーブルビューから追加または削除するたびに、コンテンツは再ロードされず、セグメント化されたコントロールを押しても何も起こりません。

私が起こっていただきましたわからないので、私は..

コード表データをリロードしています:

輸入のUIKit インポートCoreData

クラスMainVC:のUIViewController、UITableViewDelegate、UITableViewDataSource、NSFetchedResultsControllerDelegateを{

@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var segControl: UISegmentedControl! 

var fetchedResultsController: NSFetchedResultsController<Event>! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    tableView.delegate = self 
    tableView.dataSource = self 
    //generateTest() 
    attemptFetchRequest() 
} 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath) as? EventCell { 
     configureCell(cell: cell, indexPath: indexPath as NSIndexPath) 
     return cell 
    } 

    return EventCell() 
} 

//calling configure cell in this VC too 

func configureCell(cell: EventCell, indexPath: NSIndexPath) { 
    let event = fetchedResultsController.object(at: indexPath as IndexPath) 
    cell.configureCell(event: event) 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    if let events = fetchedResultsController.fetchedObjects , events.count > 0 { 
     let event = events[indexPath.row] 
     performSegue(withIdentifier: "DetailsVC", sender: event) 
    } 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "DetailsVC" { 
     if let dest = segue.destination as? DetailsVC { 
      if let event = sender as? Event { 
       dest.eventToEdit = event 
      } 
     } 
    } 
} 



func numberOfSections(in tableView: UITableView) -> Int { 
    if let sections = fetchedResultsController.sections { 
     return sections.count 
    } 
    return 0 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let sections = fetchedResultsController.sections { 
     let sectionInfo = sections[section] 
     return sectionInfo.numberOfObjects 
    } 

    return 0 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 126 
} 

func attemptFetchRequest() { 
    let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest() 
    let dateSort = NSSortDescriptor(key: "date", ascending: false) //sort by date 
    let tagSort = NSSortDescriptor(key: "tag", ascending: false) //sort by tag 


    if segControl.selectedSegmentIndex == 0 { 
     fetchRequest.sortDescriptors = [dateSort] 
    } else { 
     fetchRequest.sortDescriptors = [tagSort] 
    } 

    let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 

    controller.delegate = self 

    self.fetchedResultsController = controller 

    do { 
     try fetchedResultsController.performFetch() 
    } catch { 
     let err = error as NSError 
     print("\(err)") 
    } 
} 

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    tableView.beginUpdates() 

} 

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    tableView.endUpdates() 
} 

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 

    switch(type) { 

    case.insert: 
     if let indexPath = newIndexPath { 
      tableView.insertRows(at: [indexPath], with: .fade) 
     } 
     break 
    case.delete: 
     if let indexPath = indexPath { 
      tableView.deleteRows(at: [indexPath], with: .fade) 
     } 
     break 
    case.update: 
     if let indexPath = indexPath { 
      if let cell = tableView.cellForRow(at: indexPath) as? EventCell { 
       configureCell(cell: cell, indexPath: indexPath as NSIndexPath) 
      } 


     } 
     break 
    case.move: 
     if let indexPath = indexPath { 
      tableView.deleteRows(at: [indexPath], with: .fade) 
     } 
     if let indexPath = newIndexPath { 
      tableView.insertRows(at: [indexPath], with: .fade) 
     } 
     break 

    } 
} 

func generateTest() { 
    let event = Event(context: context) 
    event.detail = "going to a meeting" 
    event.location = "san fran" 
    event.tag = "meeting" 
    event.title = "Google meeting" 

    let event2 = Event(context: context) 
    event2.detail = "going to a meeting" 
    event2.location = "LA" 
    event2.tag = "lunch" 
    event2.title = "lunch with musk" 

    let event3 = Event(context: context) 
    event3.detail = "going to a meeting" 
    event3.location = "Toronto" 
    event3.tag = "date" 
    event3.title = "visiting GF" 

    let event4 = Event(context: context) 
    event4.detail = "going to a meeting" 
    event4.location = "san fran" 
    event4.tag = "meeting" 
    event4.title = "Google meeting" 

    ad.saveContext() 
} 


@IBAction func segControllerChanged(_ sender: Any) { 

    attemptFetchRequest() 
    tableView.reloadData() 
} 

おかげ

+0

:あなたはその後、あなたはセクションの名前を取得するためにNSFetchedResultsSectionInfoを使用することができ、あなたのNSFetchedResultsController

func attemptFetchRequest() { let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest() var key: String let dateSort = NSSortDescriptor(key: "date", ascending: false) //sort by date let tagSort = NSSortDescriptor(key: "tag", ascending: false) //sort by tag if segControl.selectedSegmentIndex == 0 { key = "date" } else { key = "tag" } let sort = NSSortDescriptor(key: key, ascending: false) fetchRequest.sortDescriptors = [sort] fetchRequest.sectionKeyPath = key let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) controller.delegate = self self.fetchedResultsController = controller do { try fetchedResultsController.performFetch() } catch { let err = error as NSError print("\(err)") } } 

sectionKeyPathを指定する必要が

あなたはまだ日付のセクションに項目が欲しいですか? – Paulw11

+0

@ Paulw11これらはどちらも文字列なので、日付をソートすると、最小限のコードを切り替えてタグを並べ替えることができます:) – JasonP

+0

はい、文字列のソートは機能しません。 – Paulw11

答えて

0

あなたは、各セクションのプロパティでソートするsection​Name​Key​Pathを使用することができますし、あなたのNSFetchedResultsControllerではなく、それなしとしてフェッチされたオブジェクトを返すので、彼らが注文してしまいます、それに応じて各フェッチされたセクションにセクションやオブジェクトを返します。セクションです。

あなたは現在nilに設定されています。

セクションを決定するために使用されるフェッチされたオブジェクトのキーパス。

0

あなたの日付がDateとして保存されていると、コアデータに文字列が正しい日付順にソートされないことがあります。やる、ソートは「タグ」である場合

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    let sectionInfo = self.fetchedResultsController.sections?[section] 
    return sectionInfo?.name ?? "" 
} 
+0

fetchRequestにメンバーがないというエラーがスローされていますsectionKeyPath?申し訳ありませんが、コアデータを完全に新しくしました – JasonP