CoreData - TableView 未更新
CoreData - TableView does not get updated
所以,我正在努力学习如何正确处理 CoreData。
这是我的代码:
import UIKit
import CoreData
class IngredientsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate {
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var fetchedResultsController: NSFetchedResultsController?
override func viewDidLoad() {
super.viewDidLoad()
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchIngredients(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
fetchedResultsController?.performFetch(nil)
}
func fetchIngredients() -> NSFetchRequest {
var fetchRequest = NSFetchRequest(entityName: "DetailsForRecipe")
let sortDescriptor = NSSortDescriptor(key: "ingredients", ascending: true)
fetchRequest.predicate = nil
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.fetchBatchSize = 20
return fetchRequest
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController?.sections?[section].numberOfObjects ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ingCell", forIndexPath: indexPath) as! UITableViewCell
if let ingCell = fetchedResultsController?.objectAtIndexPath(indexPath) as? DetailsForRecipe {
cell.textLabel?.text = ingCell.ingredients
}
return cell
}
}
和
import UIKit
import CoreData
class SingleIngredientViewController: UIViewController {
@IBOutlet var ingField: UITextField!
var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func addIng(sender: AnyObject) {
let entityDescription = NSEntityDescription.entityForName("DetailsForRecipe", inManagedObjectContext: moc!)
let details = DetailsForRecipe(entity: entityDescription!, insertIntoManagedObjectContext: moc)
details.ingredients = ingField.text
var error: NSError?
moc?.save(&error)
if let err = error {
var status = err.localizedFailureReason
println(status)
} else {
println("Ingredient \(ingField.text) saved successfully!")
}
if let navigation = navigationController {
navigation.popViewControllerAnimated(true)
}
}
}
我的模特:
import Foundation
import CoreData
class DetailsForRecipe: NSManagedObject {
@NSManaged var name: String
@NSManaged var ingredients: String
@NSManaged var image: NSData
}
应用应在文本字段中插入成分名称,将其保存到 coreData,然后应在 table 视图中检索。当我输入成分名称并按 "add" 时,prinln 消息说它已成功保存,但 table 视图没有更新。
我在这里做错了什么?我不是开发人员,我已经阅读了很多关于如何执行此操作的教程,但它非常令人困惑!所以请原谅我。
提前致谢!
更改完成后在您的 table 视图上调用 reloadData()
。
我还没有阅读您的完整源代码,但立即浏览了一下,我没有看到您调用了 table 视图的 reloadData
函数。如果您没有为您的 table 视图设置 IBOutlet,您将需要这样做,然后在其上调用 reloadData()
。
所以,我正在努力学习如何正确处理 CoreData。
这是我的代码:
import UIKit
import CoreData
class IngredientsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate {
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var fetchedResultsController: NSFetchedResultsController?
override func viewDidLoad() {
super.viewDidLoad()
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchIngredients(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
fetchedResultsController?.performFetch(nil)
}
func fetchIngredients() -> NSFetchRequest {
var fetchRequest = NSFetchRequest(entityName: "DetailsForRecipe")
let sortDescriptor = NSSortDescriptor(key: "ingredients", ascending: true)
fetchRequest.predicate = nil
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.fetchBatchSize = 20
return fetchRequest
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController?.sections?[section].numberOfObjects ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ingCell", forIndexPath: indexPath) as! UITableViewCell
if let ingCell = fetchedResultsController?.objectAtIndexPath(indexPath) as? DetailsForRecipe {
cell.textLabel?.text = ingCell.ingredients
}
return cell
}
}
和
import UIKit
import CoreData
class SingleIngredientViewController: UIViewController {
@IBOutlet var ingField: UITextField!
var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func addIng(sender: AnyObject) {
let entityDescription = NSEntityDescription.entityForName("DetailsForRecipe", inManagedObjectContext: moc!)
let details = DetailsForRecipe(entity: entityDescription!, insertIntoManagedObjectContext: moc)
details.ingredients = ingField.text
var error: NSError?
moc?.save(&error)
if let err = error {
var status = err.localizedFailureReason
println(status)
} else {
println("Ingredient \(ingField.text) saved successfully!")
}
if let navigation = navigationController {
navigation.popViewControllerAnimated(true)
}
}
}
我的模特:
import Foundation
import CoreData
class DetailsForRecipe: NSManagedObject {
@NSManaged var name: String
@NSManaged var ingredients: String
@NSManaged var image: NSData
}
应用应在文本字段中插入成分名称,将其保存到 coreData,然后应在 table 视图中检索。当我输入成分名称并按 "add" 时,prinln 消息说它已成功保存,但 table 视图没有更新。
我在这里做错了什么?我不是开发人员,我已经阅读了很多关于如何执行此操作的教程,但它非常令人困惑!所以请原谅我。 提前致谢!
更改完成后在您的 table 视图上调用 reloadData()
。
我还没有阅读您的完整源代码,但立即浏览了一下,我没有看到您调用了 table 视图的 reloadData
函数。如果您没有为您的 table 视图设置 IBOutlet,您将需要这样做,然后在其上调用 reloadData()
。