Swift NSFetchedResultsController Sections Всегда возвращает ноль - PullRequest
0 голосов
/ 28 ноября 2018

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

. Я создал простую модель данных , и в ней есть сущность Книги(Livro) с некоторыми атрибутами, включая категорию, заголовок и изображение (для показа в резюме).Я хотел бы показать затем разделить на разделы (по категориям - категории).

Моя проблема в том, что я могу получить данные из Data-Core, я могу вывести все это на консоль, но fetchResultsController.sectionsвсегда возвращать ноль, даже если атрибут "категорий" имеет какое-либо значение.

Метод CV делегата numberOfSections (в представлении коллекции) вызывается, но возвращает 0, и делегат CV делегата cellForItemAt НИКОГДА не вызывается.

Вот некоторые из моих кодов на моем UIViewController:

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    ListaLivros.delegate = self
    ListaLivros.dataSource = self

    if let context = container?.viewContext {
        let sortDescriptor = NSSortDescriptor(key: "titulo", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
        let sortDescriptorSections = NSSortDescriptor(key: "categoria", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))

        let request: NSFetchRequest<Livro> = Livro.fetchRequest()
        request.sortDescriptors = [sortDescriptor, sortDescriptorSections]
        request.predicate = nil

        fetchedResultsController = NSFetchedResultsController<Livro>(
            fetchRequest: request,
            managedObjectContext: context,
            sectionNameKeyPath: "categoria",
            cacheName: nil)
        fetchedResultsController?.delegate = self

        //------______---======   PRINT BOOKS   ------______---======
        if let results = try? context.fetch(Livro.fetchRequest()) {

            for livro in results {
                print ("  -> Secoes: \(String(describing: fetchedResultsController?.sections))")
                print ("   --> Livro: \(livro)")
//                    context.delete(livro as! NSManagedObject)
//                    try? context.save()
            }
        }
        //------______---======   TESTE   ------______---======
    }

    atualizaView()
    mostraBDStats ()
} // DIDLOAD

Я поставил все функции делегата на расширения.Часть CoreData, кажется, работает нормально, так как она вставляет данные в DataCore.Итак, я публикую только свое расширение CV:

extension ListaLivrosVC: UICollectionViewDelegate, UICollectionViewDataSource {
    func numberOfSections( in collectionView: UICollectionView) - > Int {
        print("Num Sec: (String(describing: fetchedResultsController?.sections?.count))")

    if let context = container?.viewContext {
        //------______---======   PRINT BOOKS   ------______---======
        if let results = try? context.fetch(Livro.fetchRequest()) {
            for livro in results {
                print ("  -> 2Secoes: \(String(describing: fetchedResultsController))")
                print ("   --> 2Livro: \(livro)")
                //                    context.delete(livro as! NSManagedObject)
                //                    try? context.save()
            }
        }
    }
    return fetchedResultsController?.sections?.count ?? 0
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    guard let sections = fetchedResultsController?.sections else { return 0 }

    if !PickerSecoes.contains(sections[section].name) {
        PickerSecoes.append(sections[section].name)
    }

    return sections[section].numberOfObjects

} // COLLECTION

//--------------------------------------------------------------------
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let celula = ListaLivros.dequeueReusableCell(withReuseIdentifier: "LivrosCell", for: indexPath)

    if let LivroCelula = celula as? LivroCollectionCell {
        if let livro = fetchedResultsController?.object(at: indexPath) {
            LivroCelula.Imagem.image = livro.getImagem()
            LivroCelula.Titulo.text = livro.titulo
        } // if
    } // IF

    return celula
} // COLLECTION
}

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

Numero de Livros no BD: 2
  -> Secoes: nil
   --> Livro: Titulo: Optional("teste"), Autores: Optional("teste123"), Categoria: Optional("testetestes"), Tags: nil
  -> Secoes: nil
   --> Livro: Titulo: Optional("teste2"), Autores: Optional("tests do"), Categoria: Optional("casa"), Tags: nil
Num Sec: nil
  -> 2Secoes: Optional(<NSFetchedResultsController: 0x600003382700>)
   --> 2Livro: Titulo: Optional("teste"), Autores: Optional("teste123"), Categoria: Optional("testetestes"), Tags: nil
  -> 2Secoes: Optional(<NSFetchedResultsController: 0x600003382700>)
   --> 2Livro: Titulo: Optional("teste2"), Autores: Optional("tests do"), Categoria: Optional("casa"), Tags: nil
Numero de Livros no BD: 2

Просто для дополнения, в том же приложении у меня есть две другие похожие сущности.Их обоих я мог бы успешно перечислить на TableView с разделами.Приведенный выше код был скопирован с них и адаптирован для использования CollectionView.

Я использую XCode 10, Swift 4.2

1 Ответ

0 голосов
/ 29 ноября 2018

Отвечая на мой собственный вопрос, я думаю, что понял, что не так, хотя я не знаю, почему это не так и почему это работает с другой сущностью с TableView.

Проблема кажется мне предикатом.Комментирование строки:

    request.predicate = nil

, кажется, решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...