0

Я пытаюсь иметь 2 отдельных UITableViews внутри 1 UIViewController, но трюк в том, что я пытаюсь сделать это, чтобы оба они загрузились из CoreDate.2 UITableViews внутри 1 UIViewController как загрузка из CoreData

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

То, как я получаю данные для таблиц, использует FRC (NSFetchedResultsController), но, похоже, я только вслух имею 1 из них для UIViewController.

Вот мои 2 брата FRC, которые я использую.

FRC 1:

func getFRCIngredients() -> NSFetchedResultsController<Ent_Ingredients> { 

    let fetchReq: NSFetchRequest<Ent_Ingredients> = Ent_Ingredients.fetchRequest() 
    let sortDescriptor = NSSortDescriptor(key: "order", ascending: true) 
    let predicate = NSPredicate(format: "recipeRel == %@", self.recipe!) 

    fetchReq.sortDescriptors = [sortDescriptor] 
    fetchReq.predicate = predicate 

    let frc = NSFetchedResultsController(fetchRequest: fetchReq, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) 

    return frc 
} 

FRC 2:

func getFRCDirections() -> NSFetchedResultsController<Ent_Directions> { 

    let fetchReq: NSFetchRequest<Ent_Directions> = Ent_Directions.fetchRequest() 
    let sortDescriptor = NSSortDescriptor(key: "order", ascending: true) 
    let predicate = NSPredicate(format: "recipeRel == %@", self.recipe!) 

    fetchReq.sortDescriptors = [sortDescriptor] 
    fetchReq.predicate = predicate 

    let frc = NSFetchedResultsController(fetchRequest: fetchReq, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) 

    return frc 
} 

Я получаю ошибку внутри viewDidLoad() после того как я пытаюсь установить делегат 2-го FRC быть самостоятельной. Что имеет смысл, когда я думаю об этом, вы, вероятно, не можете управлять им двумя отдельными наборами данных. Ошибка: «libc++abi.dylib: terminating with uncaught exception of type NSException»

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) 

    tableViewIngredients.dataSource = self 
    tableViewIngredients.delegate = self 
    tableViewIngredients.register(UITableViewCell.self, forCellReuseIdentifier: "recipeIngredientCell") 

    tableViewDirections.dataSource = self 
    tableViewDirections.delegate = self 
    tableViewDirections.register(UITableViewCell.self, forCellReuseIdentifier: "recipeDirectionCell") 

    recipeName.text = recipe!.name 
    recipeImage.image = UIImage(data: recipe!.image as! Data) 

    oldName = recipe!.name! 

    frcIngredients = getFRCIngredients() 
    frcIngredients!.delegate = self 

    do { 
     try frcIngredients!.performFetch() 
    } catch { 
     fatalError("Failed to perform initial FRC fetch for Ingredients") 
    } 

    frcDirections = getFRCDirections() 
    frcDirections!.delegate = self //<- ***ERRORS HERE*** 

    do { 
     try frcDirections!.performFetch() 
    } catch { 
     fatalError("Failed to perform initial FRC fetch for Ingredients") 
    } 

    NotificationCenter.default.addObserver(self, selector: #selector(AddRecipesVC.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
} 

Как я могу сделать то, что я пытаюсь сделать здесь? Я все еще относительно новичок в Xcode и Swift, поэтому любая помощь будет очень оценена.

Спасибо!

ответ

0

Так получилось, что я сделал глупую ошибку. Я забыл, что я не обновлял имена атрибутов в объекте Ent_Directions, поэтому я всегда вызывал атрибут, которого не было. Но на всякий случай это помогает кому-то позже, это код, который я использовал, чтобы получить 2 UITableViews, работающих в одном UIViewController. Я удалил дополнительный код, который не относился к UITableViews.

Swift 3.0:

class EditRecipesVC: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { 

    // MARK: - Constants and Variables 

    let moc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    var frcIngredients: NSFetchedResultsController<Ent_Ingredients>? 
    var frcDirections: NSFetchedResultsController<Ent_Directions>? 
    var recipe: Ent_Recipes? 

    // MARK: - Class Loading Functions 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) 

     tableViewIngredients.dataSource = self 
     tableViewIngredients.delegate = self 
     tableViewIngredients.rowHeight = UITableViewAutomaticDimension 
     tableViewIngredients.estimatedRowHeight = 40 

     tableViewDirections.dataSource = self 
     tableViewDirections.delegate = self 
     tableViewDirections.rowHeight = UITableViewAutomaticDimension 
     tableViewDirections.estimatedRowHeight = 40 

     recipeName.text = recipe!.name 
     recipeImage.image = UIImage(data: recipe!.image as! Data) 

     oldName = recipe!.name! 

     frcIngredients = getFRCIngredients() 
     frcIngredients!.delegate = self 

     do { 
      try frcIngredients!.performFetch() 
     } catch { 
      fatalError("Failed to perform initial FRC fetch for Ingredients") 
     } 

     frcDirections = getFRCDirections() 
     frcDirections!.delegate = self 

     do { 
      try frcDirections!.performFetch() 
     } catch { 
      fatalError("Failed to perform initial FRC fetch for Ingredients") 
     } 

     NotificationCenter.default.addObserver(self, selector: #selector(AddRecipesVC.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
    } 

    // MARK: - Outlets and Actions 

    @IBOutlet var tableViewIngredients: UITableView! 
    @IBOutlet var tableViewDirections: UITableView! 

    // MARK: - Table View Data Source 

    func numberOfSections(in tableView: UITableView) -> Int { 

     var frc: NSFetchedResultsController<NSFetchRequestResult> 

     if (tableView == tableViewIngredients) { 
      frc = frcIngredients as! NSFetchedResultsController<NSFetchRequestResult> 
     } else { 
      frc = frcDirections as! NSFetchedResultsController<NSFetchRequestResult> 
     } 

     if let sections = frc.sections { 
      return sections.count 
     } 

     return 0 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     var frc: NSFetchedResultsController<NSFetchRequestResult> 

     if (tableView == tableViewIngredients) { 
      frc = frcIngredients as! NSFetchedResultsController<NSFetchRequestResult> 
     } else { 
      frc = frcDirections as! NSFetchedResultsController<NSFetchRequestResult> 
     } 

     if let sections = frc.sections { 
      let currentSection = sections[section] 
      return currentSection.numberOfObjects 
     } 

     return 0 
    } 

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

     if (tableView == tableViewIngredients) { 
      let cell: RecipeIngredientTVCell = tableView.dequeueReusableCell(withIdentifier: "recipeIngredientCell", for: indexPath) as! RecipeIngredientTVCell 

      return cell 
     } else { 
      let cell: RecipeDirectionTVCell = tableView.dequeueReusableCell(withIdentifier: "recipeDirectionCell", for: indexPath) as! RecipeDirectionTVCell 

      return cell 
     } 
    } 

    // MARK: - Custom Functions 

    func getFRCIngredients() -> NSFetchedResultsController<Ent_Ingredients> { 

     let fetchReq: NSFetchRequest<Ent_Ingredients> = Ent_Ingredients.fetchRequest() 
     let sortDescriptor = NSSortDescriptor(key: "order", ascending: true) 
     let predicate = NSPredicate(format: "recipeRel == %@", self.recipe!) 

     fetchReq.sortDescriptors = [sortDescriptor] 
     fetchReq.predicate = predicate 

     let frc = NSFetchedResultsController(fetchRequest: fetchReq, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) 

     return frc 
    } 

    func getFRCDirections() -> NSFetchedResultsController<Ent_Directions> { 

     let fetchReq: NSFetchRequest<Ent_Directions> = Ent_Directions.fetchRequest() 
     let sortDescriptor = NSSortDescriptor(key: "order", ascending: true) 
     let predicate = NSPredicate(format: "recipeRel == %@", self.recipe!) 

     fetchReq.sortDescriptors = [sortDescriptor] 
     fetchReq.predicate = predicate 

     let frc = NSFetchedResultsController(fetchRequest: fetchReq, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) 

     return frc 
    } 
} 
Смежные вопросы