2016-12-09 8 views
0

Я хочу, чтобы пользователь мог щелкнуть ячейку в таблице, и она извлекает любой объект по этому пути указателя и устанавливает его в переменную, чтобы я мог ее вытащить, но к следующему VC.Извлечение объекта из ячейки tableview с помощью fetchcontroller?

Как это достигается? Моя логика была использовать что-то вроде:

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 
     } 

Я думал, что это сделает setRoutine индекс патч нажал, то я мог бы послать его к другому VC через Segue, но я чувствую, им не хватает несколько шагов, как он не работает !

Спасибо за любое наполнение помощи в зазорах в моем понимании

обновление, весь КИ в соответствии с просьбой

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

такие как? это segue, я не был уверен, что еще нужно, чтобы построить запрос – infernouk

+0

, где вы называете это segue? (в cellForRowAtIndexPath)? –

ответ

0

Сначала создайте локальный var в текущем VC и присвоить ей значение в ваших didSelectRow например:

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

im только с использованием UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate в настоящее время – infernouk