【发布时间】:2019-07-05 08:52:29
【问题描述】:
我需要在选择 UICollectionView 单元格时显示一个新的 ViewController,并从用于填充所选单元格的实体传递数据。
这是用于填充单元格数据的代码:
let pets = PersistenceManager.shared.fetch(Pet.self)
var _fetchResultsController: NSFetchedResultsController <Pet>?
var fetchResultsController: NSFetchedResultsController <Pet>?{
get{
if _fetchResultsController == nil {
let moc = PersistenceManager.shared.context
moc.performAndWait {
let fetchRequest = PersistenceManager.shared.petsFetchRequest()
_fetchResultsController = NSFetchedResultsController.init(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil) as? NSFetchedResultsController<Pet>
_fetchResultsController?.delegate = self
do {
try self._fetchResultsController?.performFetch()
}catch {
}
}
}
return _fetchResultsController
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionViewHorizontal.dequeueReusableCell(withReuseIdentifier: "HorCell", for: indexPath) as! PRMainHorizontalCollectionViewCell
if let pet= self.fetchResultsController?.fetchedObjects, indexPath.row < pet.count{
let _pet= fetchResultsController!.object(at: indexPath)
// cell UI goes here
}
return cell
}
我知道我需要使用 didSelectItemAt,我只是不知道函数中需要输入哪些信息。请让我知道需要更好地帮助回答这个问题的其他任何事情。谢谢。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// Added the line below based on karthik's answer. But I am unsure how to implement it.
let selectedObj = fetchResultsController!.object(at: indexPath)
let vc = self.storyboard?.instantiateViewController(withIdentifier: "selectedPetViewController") as! PRSelectedPetViewController
navigationController?.pushViewController(vc, animated: true)
}
【问题讨论】:
-
在选择时获取带有indexpath
fetchResultsController!.object(at: indexPath)的选定对象,然后将其传递给另一个视图控制器。 -
初始化
fetchResultsController的方式很丑陋,而且objective-c-ish。在 Swift 中,NSFetchedResultsController应该被初始化为非可选和原生的lazy var fetchResultsController: NSFetchedResultsController<Pet> = { .... }()。 -
☝️☝️☝️ 没错,但这并没有解决 OP 的问题。
-
你使用segue吗?
-
@vadian 我看到苹果还使用
lazy var而不是let来初始化fetchResultsController。为什么在使用NSFetchResultsController时使用lazy var而不是let?
标签: ios swift core-data uicollectionview