我在尝试附加名为products
的核心数据实体时遇到问题 - 我使用的代码与我用来添加companies
的代码相同,效果很好。该应用程序的唯一区别是,我猜你可以说只有一个公司的“静态”桌面视图,而产品的tableview是根据挖掘的公司单元格动态设置的。但我不确定这会导致这个问题。
自昨天以来,我一直在调试/检查整个应用程序的值,似乎无论我尝试改变什么,products.count
中的numberOfRowsInSection
仍为0
。
当用户在三个文本字段中输入新值后点击完成按钮时,我调用了一个名为handleSave()
的函数,就像我的其他对象companies
一样:
func handleSave() {
guard let newProductUrl = NSURL(string: urlTextField.text!) else {
print("error getting text from product url field")
return
}
guard let newProductName = self.nameTextField.text else {
print("error getting text from product name field")
return
}
guard let newProductImage = self.logoTextField.text else {
print("error getting text from product logo field")
return
}
self.productController?.save(name: newProductName, url: newProductUrl as URL, image: newProductImage)
let cc = UINavigationController()
let companyController = CompanyController()
viewController = companyController
cc.viewControllers = [companyController]
present(cc, animated: true, completion: nil)
}
然后调用save
函数追加products
:
func save(name: String, url: URL, image: String) {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
let entity =
NSEntityDescription.entity(forEntityName: "Product",
in: managedContext)!
let product = NSManagedObject(entity: entity,
insertInto: managedContext)
product.setValue(name, forKey: "name")
product.setValue(url, forKey: "url")
product.setValue(image, forKey: "image")
do {
try managedContext.save()
products.append(product)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
tableView.reloadData()
}
数据在viewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
let companyToDisplay = self.navigationItem.title!
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Product")
fetchRequest.predicate = NSPredicate(format:"company.name == %@",companyToDisplay)
do {
products = try managedContext.fetch(fetchRequest)
print(products)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
当使用完全相同的过程添加companies
时,新公司会出现在tableview中。但是现在有产品,情况并非如此; tableview仍然是空的。我不确定区别是什么,我对核心数据的经验不足,我觉得我可以找出问题所在。
非常感谢能够解决这个问题的任何人!
答案 0 :(得分:0)
调用handleSave()
&amp;在执行table.reloadData()
之前,您需要在viewWillAppear()
中执行数据库提取操作。
将fetchRequest
逻辑从viewWillAppear()
中隔离出来,转换为名为fetchUpdatedData()
的函数。
现在,在try managedContext.save()
之后,执行fetchUpdatedData()
,更新您的product
数据阵列&amp;然后按table.reloadData()
答案 1 :(得分:0)
使用NSFetchedResultsController
让您的视图与您的模型保持同步。 NSFetchedResultsController
监视核心数据并在有更新时发送委托消息 - 然后您可以更新您的tableview。否则,只要核心数据发生变化,您就必须手动执行刷新。