Swift NSFetchedResultsController 部分总是 returns 无
Swift NSFetchedResultsController Sections Always returns nil
我是 swift 的新手,我正在尝试制作一个应用程序来学习它的一些知识。
我创建了一个简单的应用程序来存储一些书籍的信息,然后在 CollectionView.
上显示它
我制作了一个简单的 数据模型,它有一个 Books (Livro) 实体,带有一些属性,包括类别、标题和图像(显示在 CV 上)。我想展示然后分成几个部分(按类别 - 类别)。
我的问题是我可以从 Data-Core 获取数据,我可以在控制台上列出所有数据,但是 fetchResultsController.sections 总是 return nil,即使 "categoria" 属性有一定的价值。
委托 CV 方法 numberOfSections(在 collection 视图中)被调用但它 returns 0,并且从未调用 de 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 上插入数据。所以,我只发布我的简历扩展名:
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
}
我不知道我还能做什么。 运行 应用程序,我可以看到我插入的 2 本书,但它们没有出现在简历上:
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。
我用的是XCode10,Swift4.2
回答我自己的问题,我想我意识到出了什么问题,虽然我不知道为什么它是错误的以及为什么它与另一个带有 TableView 的实体一起工作。
这个问题好像是谓词。评论该行:
request.predicate = nil
似乎解决了问题。
我是 swift 的新手,我正在尝试制作一个应用程序来学习它的一些知识。 我创建了一个简单的应用程序来存储一些书籍的信息,然后在 CollectionView.
上显示它我制作了一个简单的 数据模型,它有一个 Books (Livro) 实体,带有一些属性,包括类别、标题和图像(显示在 CV 上)。我想展示然后分成几个部分(按类别 - 类别)。
我的问题是我可以从 Data-Core 获取数据,我可以在控制台上列出所有数据,但是 fetchResultsController.sections 总是 return nil,即使 "categoria" 属性有一定的价值。
委托 CV 方法 numberOfSections(在 collection 视图中)被调用但它 returns 0,并且从未调用 de 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 上插入数据。所以,我只发布我的简历扩展名:
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
}
我不知道我还能做什么。 运行 应用程序,我可以看到我插入的 2 本书,但它们没有出现在简历上:
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。
我用的是XCode10,Swift4.2
回答我自己的问题,我想我意识到出了什么问题,虽然我不知道为什么它是错误的以及为什么它与另一个带有 TableView 的实体一起工作。
这个问题好像是谓词。评论该行:
request.predicate = nil
似乎解决了问题。