NSFetchedResultsController возвращает строку и заполняет таблицу, но метки ячейки таблицы исчезают

У меня проблема с NSFetchedResultsViewController. Вот моя настройка. Мои приложения rootViewController – это TabBarController. К моему UITabBarController подключены два контроллера представления (поэтому у меня есть 2 вкладки). У UIViewControllers, связанных с каждой вкладкой, есть контейнеры, в которые я встраиваю другой UIViewController. Один из этих UIViewControllers имеет UITableView, который я пытаюсь заполнить данными, поступающими из CoreData. Итак, чтобы заполнить UITableView, я использую NSFetchedResultsViewController.

Вот моя странная проблема. Если я сделаю UIViewController с UITableView / NSFetchedResultsController первой вкладкой, так что она будет показана сначала, когда приложение загрузится, все отлично работает, и я вижу 3 строки данных в представлении таблицы как ожидалось (я устанавливаю две метки в каждом пользовательском ячейка таблицы).

Ярлыки, видимые для каждой строки на первой вкладке

Однако, если я сделаю, что ViewController будет второй вкладкой, запустите приложение, просмотрите мою первую вкладку, а затем коснитесь второй вкладки, в которой находится мой tableview, создаются 3 строки, но я не вижу этикеток, просто пустую строку с индикатор раскрытия информации.

Ярлыки исчезают, но строки все еще создаются, когда на второй вкладке

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

Раньше я не использовал CoreData и просто заполнял таблицу простыми объектами в памяти, и все работало правильно при нажатии между вкладками … данные всегда появлялись. Я только начал видеть эту проблему после реализации fetchedResultsController.

Вот мой код:

class OrderListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate { @IBOutlet weak var searchBar: UISearchBar! @IBOutlet weak var tableView: UITableView! var delegate: OrderListViewControllerDelegate? private lazy var fetchedResultsController: NSFetchedResultsController = { let request = NSFetchRequest(entityName: "ListOrder") let dateSort = NSSortDescriptor(key: "statusSubmittedAt", ascending: true) request.sortDescriptors = [dateSort] let pred = NSPredicate(format: "(statusBuilt == %@ and statusCancelled == %@ and statusComplete == %@ and statusSubmitted == %@)", NSNumber(bool: false), NSNumber(bool: false), NSNumber(bool: false), NSNumber(bool: true)) request.predicate = pred let moc = (UIApplication.sharedApplication().delegate as? AppDelegate)!.managedObjectContext let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) controller.delegate = self return controller }() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. do { try fetchedResultsController.performFetch() } catch { fatalError("Failed to initialize FetchedResultsController: \(error)") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() //Dispose of any resources that can be recreated. } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return fetchedResultsController.sections!.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sections = fetchedResultsController.sections! as [NSFetchedResultsSectionInfo] let sectionInfo = sections[section] return sectionInfo.numberOfObjects } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = (tableView.dequeueReusableCellWithIdentifier("OrderListTableViewCell", forIndexPath: indexPath) as? OrderListTableViewCell)! // Configure the cell... let order = (fetchedResultsController.objectAtIndexPath(indexPath) as? ListOrder)! // Update Cell if let userDisplayName = order.userDisplayName { print(userDisplayName) //prints correct value to console cell.orderName.text = userDisplayName } if let placementDescription = order.tagPlacementDescription { cell.orderName.text = cell.orderName.text! + " - \(placementDescription)" print(placementDescription) //prints correct value to console } if let orderTime = order.statusSubmittedAt { cell.orderTime.text = String.stringTimeFromDate(orderTime) } return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.delegate?.didSelectOrder(self, order:(fetchedResultsController.objectAtIndexPath(indexPath) as? ListOrder)!) } } 

Любая помощь очень ценится. У меня нет идей.

Кажется, что код правильный, но я предлагаю вам сделать NSFetchResultsController тем, как он обычно реализуется в коде. Вам необходимо реализовать как минимум три метода в вашем делетете

  1. controllerWillChangeContent:
  2. controllerDidChangeContent:
  3. controller:DidChangeObject:atIndexPath:forChangeType:newIndexPath

Надеюсь это поможет.

PS Вы уверены, что ваши значения печатаются каждый раз, когда вы вызываете метод для ячейки. Попробуйте установить точку останова или else-item, проверьте это. Кроме того, я бы повторно проверил идентификаторы для ячейки и соединения точек