2016-12-09 9 views
0

私は、ユーザーがテーブル内のセルをクリックできるようにし、そのインデックスパスにあるオブジェクトを取得して変数に設定するので、次のVCに引き寄せることができます。fetchcontrollerを使用してtableviewセルからオブジェクトを取得していますか?

これはどのように達成されましたか?私のロジックのようなものを使用することでした:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "loadTodaysRoutine" { 
     setRoutine = fetchedResultsController.fetchedobjects[indexPath.row] 
     if let todaysRoutineController = segue.destination as? RoutineController { 
       todaysRoutineController.routineObject = setRoutine 
     } 

を私はその後、私はセグエを介して他のVCに送信することができ、これはパッチがクリックsetRoutineインデックスを作るだろうと思ったが、私はそれが仕事をdoesntのよういくつかのステップが欠落イム感じます!私の理解のギャップで任意のヘルプ充填用

おかげ

import Foundation 
import UIKit 
import CoreData 

class YourWorkoutsController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { 

    // MARK: - DECLARATIONS 

    private let persistentContainer = NSPersistentContainer(name: "Lift") 
    var managedObjectContext: NSManagedObjectContext? 

    fileprivate var setRoutine: NSManagedObject? 

    @IBAction func unwindToTemplates(segue: UIStoryboardSegue) {} 
    @IBOutlet weak var workoutTemplateTable: UITableView! 
    @IBOutlet weak var createWorkoutLabel: UILabel! 
    @IBOutlet weak var nameLabel: UILabel! 

    // MARK: - ACTIONS 

    @IBAction func cancelWorkoutSelection(_ sender: Any) { 
     self.performSegue(withIdentifier: "unwindToRoutineWithSegue", sender: self) 
    } 

    // MARK: - VIEWDIDLOAD 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupView() 
     workoutTemplateTable.delegate = self 
     workoutTemplateTable.dataSource = self 

     view.backgroundColor = (UIColor.customBackgroundGraphite()) 

     persistentContainer.loadPersistentStores { (persistentStoreDescription, error) in 
      if let error = error { 
       print("Unable to Load Persistent Store") 
       print("\(error), \(error.localizedDescription)") 

      } else { 
       self.setupView() 

       do { 
        try self.fetchedResultsController.performFetch() 
       } catch { 
        let fetchError = error as NSError 
        print("Unable to Perform Fetch Request") 
        print("\(fetchError), \(fetchError.localizedDescription)") 
       } 

       self.updateView() 
      } 
     } 
    } 

    // MARK: - VIEWWILLAPPEAR 

    override func viewWillAppear(_ animated: Bool) { 

     do { 
      try self.fetchedResultsController.performFetch() 
     } catch { 
      let fetchError = error as NSError 
      print("Unable to Perform Fetch Request") 
      print("\(fetchError), \(fetchError.localizedDescription)") 
     } 
     self.workoutTemplateTable.reloadData() 
    } 


    // MARK: - TABLE SETUP 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     guard let userRoutine = fetchedResultsController.fetchedObjects else { return 0 } 
     return userRoutine.count 
    } 

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

     cell.backgroundColor = UIColor.customBackgroundGraphite() 
     cell.textLabel?.textColor = UIColor.white 

     let userRoutine = fetchedResultsController.object(at: indexPath) 
     cell.textLabel?.text = userRoutine.name 
     return cell 
    } 

    // MARK: - TABLE UPDATING COMPONENTS 

    private func setupView() { 
     setupMessageLabel() 
     updateView() 
    } 

    private func setupMessageLabel() { 
     createWorkoutLabel.text = "You Don't Have Any Workouts Yet\n Tap + To Create A New Workout" 
    } 

    fileprivate func updateView() { 
     var hasUserRoutines = false 
     if let UserRoutine = fetchedResultsController.fetchedObjects { 
      hasUserRoutines = UserRoutine.count > 0 
     } 
     workoutTemplateTable.isHidden = !hasUserRoutines 
     createWorkoutLabel.isHidden = hasUserRoutines 

    } 

    // MARK: - COREDATA FETCH 

    fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserRoutine> = { 

     // Create Fetch Request 
     let fetchRequest: NSFetchRequest<UserRoutine> = UserRoutine.fetchRequest() 
     // Configure Fetch Request 
     fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)] 
     // Create Fetched Results Controller 
     let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.persistentContainer.viewContext, sectionNameKeyPath: nil, cacheName: nil) 
     // Configure Fetched Results Controller 
     fetchedResultsController.delegate = self 
     return fetchedResultsController 
    }() 

    // MARK: - ADDING NEW ROUTINE TO THE VC/PUSHING ROUTINE TO TODAYSROUTINE VC 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     self.setRoutine = fetchedResultsController.fetchedObjects[indexPath.row] 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "addNewRoutineSegue" { 
      if let destinationViewController = segue.destination as? WorkoutDesignerController { 
       // Configure View Controller 
       destinationViewController.managedObjectContext = persistentContainer.viewContext 
      } 
     } 

     if segue.identifier == "loadTodaysRoutine" { 

      if let todaysRoutineController = segue.destination as? RoutineController { 
       todaysRoutineController.routineObject = self.setRoutine 
      } 
     } 
    } 



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

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

    // MARK: - ADDING TABLE ROW 

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 
     switch (type) { 
     case .insert: 
      if let indexPath = newIndexPath { 
       workoutTemplateTable.insertRows(at: [indexPath], with: .fade) 
      } 
      break; 
     case .delete: 
      if let indexPath = indexPath { 
       workoutTemplateTable.deleteRows(at: [indexPath], with: .fade) 
      } 
      break; 
     default: 
      print("...") 
     } 
    } 

    // MARK: - DELETING TABLE ROW 

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      //fetch exercise 
      let UserRoutine = fetchedResultsController.managedObjectContext 
      //delete exercise 
      UserRoutine.delete(fetchedResultsController.object(at: indexPath)) 
      //save exercise persistence 
      do { 
       try UserRoutine.save() 
      } catch { 
       let nserror = error as NSError 
       fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
      } 
     } 
    } 

} 
+0

もっとコードを投稿できますか? ?のような –

+0

これはセグーです。リクエストを作成するために他に何が必要なのかはわかりませんでした。 – infernouk

+0

あなたはそのセグをどこに呼びますか? (cellForRowAtIndexPath内)? –

答えて

0

最初にあなたの現在のVCでローカルvarを作成し、あなたのdidSelectRowでそれに値を割り当てる要求されるように

更新、全体VC like:

fileprivate var setRoutine: Any? 
..... 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     if let routine = fetchedResultsController.fetchedObjects[indexPath.row] { 
     self.setRoutine = routine 
    } 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "loadTodaysRoutine" { 
     if let todaysRoutineController = segue.destination as? RoutineController { 
       todaysRoutineController.routineObject = self.setRoutine 
     } 
    } 
} 
+0

どうやら私のスーパークラスの中でdidSelectRowメソッドを使ってオーバーライドしていないのですが、VCがこれを動作させるためにどのようなクラスを使用する必要がありますか?オプションの値[UserRoutine]の値を取得していますか? 'アンラップされていない。あなたは '!'を使うつもりでしたか?または '?'? ' – infernouk

+0

'tableView'のスーパークラスとは何ですか?このドキュメントを参照してくださいhttps://developer.apple.com/reference/uikit/uitableview – Santosh

+0

IMViewController、UITableViewDataSource、UITableViewDelegate、NSFetchedResultsControllerDelegate現在のところ – infernouk

関連する問題