Ios 用CoreData存储
我的应用程序非常简单:我有一个tableview来存储配方*名称,对于每个配方名称,还有一个tableview,其中包含每个配方的若干*成分 我已经用CoreData保存了名称和配料,但问题是:当我按下添加新配方名称并进入配料表视图区域时,为上一个配方保存的配料就在那里!如何清除表格视图以启动新的表格视图 此外,我的表视图不会立即更新,我必须关闭应用程序并再次打开它。我怎么修理它 注意:如果我的问题太难理解,我可以发布一些代码!提前谢谢大家=) 编辑 代码: - - - 和型号:Ios 用CoreData存储,ios,uitableview,core-data,Ios,Uitableview,Core Data,我的应用程序非常简单:我有一个tableview来存储配方*名称,对于每个配方名称,还有一个tableview,其中包含每个配方的若干*成分 我已经用CoreData保存了名称和配料,但问题是:当我按下添加新配方名称并进入配料表视图区域时,为上一个配方保存的配料就在那里!如何清除表格视图以启动新的表格视图 此外,我的表视图不会立即更新,我必须关闭应用程序并再次打开它。我怎么修理它 注意:如果我的问题太难理解,我可以发布一些代码!提前谢谢大家=) 编辑 代码: - - - 和型号: import
import Foundation
import CoreData
class Ingredients: NSManagedObject {
@NSManaged var ingredients: String
@NSManaged var relationship: NSSet
}
概述:
详细信息
对象只能有一个成分
。我怀疑你需要这种“对多”的关系,这样一份食谱就可以有很多成分Details?
)添加到您的InCreditListViewController
。这将代表所选的配方。(例如,var chosenRecipe:详细信息?
)fetchComponent
中,您需要向fetch添加一个谓词,以将结果限制到所选配方。例如,fetch.predicate=NSPredicate(格式:“任意关系==%@”,chosenRecipe)
chosenRecipe
(可能在prepareForSegue中,或者在前面的表视图中设置DidSelectRowatineXpath)fetchedResultsController
delegate方法。(你实施了这些吗?)我设法使我的TableView工作,但我仍然不知道如何清除列表,因为当我添加新项目时,旧项目将不会显示。我做完后会告诉你的!我不知道如何设置CoreData以在启动新项目时清除所有数据:(你能教我吗?@NicholasPiccoli你能再解释一下剩余问题吗?想象一下:我有一个包含多个项目的tableview,每个项目都有它自己的tableview和它自己的项目。例如,当我添加第一个配方并添加它的配料时,一切都正常,但当我输入第二个配方并尝试添加它的新配料时成分,预览配方的成分在那里!等等。它们会累积。我希望了解如何在每次添加新配方时清除成分表视图。注意:我必须重置它,但将其保留在内存中,因为稍后当我通过DidseleCrowatineXpath访问添加的每个配方的行时,将显示一个屏幕,其中包含e的详细信息每一份食谱。
import UIKit
import CoreData
class InfoViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITableViewDelegate {
@IBOutlet var nameField: UITextField!
@IBOutlet var imageView: UIImageView!
var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
override func viewDidLoad() {
super.viewDidLoad()
//Pick the image by tap
let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "chooseImage:")
tapGestureRecognizer.numberOfTapsRequired = 1
imageView.addGestureRecognizer(tapGestureRecognizer)
imageView.userInteractionEnabled = true
}
//Pick the image by tapping, accessing the photoLibrary
func chooseImage(recognizer: UITapGestureRecognizer) {
let imagePicker: UIImagePickerController = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
self.presentViewController(imagePicker, animated: true, completion: nil)
}
//Put the selected image into the screen
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject:AnyObject]) {
let pickedImage: UIImage = (info as NSDictionary).objectForKey(UIImagePickerControllerOriginalImage) as! UIImage
// small picture
let smallPicture = scaleImageWith(pickedImage, newSize: CGSizeMake(288,148))
var sizeOfImageView:CGRect = imageView.frame
sizeOfImageView.size = smallPicture.size
imageView.frame = sizeOfImageView
imageView.image = smallPicture
picker.dismissViewControllerAnimated(true, completion: nil)
}
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
picker.dismissViewControllerAnimated(true, completion: nil)
}
func scaleImageWith(image:UIImage, newSize: CGSize) -> UIImage {
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
image.drawInRect(CGRectMake(0,0, newSize.width, newSize.height))
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
@IBAction func addButton(sender: AnyObject) {
let entityDescription = NSEntityDescription.entityForName("Details", inManagedObjectContext: moc!)
let details = Details(entity: entityDescription!, insertIntoManagedObjectContext: moc)
details.name = nameField.text
var error: NSError?
moc?.save(&error)
if let err = error {
var status = err.localizedFailureReason
println("\(status)")
} else {
println("Ingredient \(nameField.text) saved successfully!")
}
if let navigation = navigationController {
navigation.popViewControllerAnimated(true)
}
}
}
import UIKit
import CoreData
class IngredientListViewController: UIViewController, NSFetchedResultsControllerDelegate {
@IBOutlet var tableView: UITableView!
var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var fetchedResultsController: NSFetchedResultsController?
override func viewDidLoad() {
super.viewDidLoad()
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchIngredient(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
fetchedResultsController?.performFetch(nil)
tableView.reloadData()
}
func fetchIngredient() -> NSFetchRequest {
var fetchRequest = NSFetchRequest(entityName: "Ingredients")
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 recipeCell = fetchedResultsController?.objectAtIndexPath(indexPath) as? Ingredients {
cell.textLabel?.text = recipeCell.ingredients
}
return cell
}
}
import UIKit
import CoreData
class IngredientViewController: UIViewController {
@IBOutlet var nameField: UITextField!
var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func addButton(sender: AnyObject) {
let entityDescription = NSEntityDescription.entityForName("Ingredients", inManagedObjectContext: moc!)
let details = Ingredients(entity: entityDescription!, insertIntoManagedObjectContext: moc)
details.ingredients = nameField.text
var error: NSError?
moc?.save(&error)
if let err = error {
var status = err.localizedFailureReason
println("\(status)")
} else {
println("Ingredient \(nameField.text) saved successfully!")
}
if let navigation = navigationController {
navigation.popViewControllerAnimated(true)
}
}
}
import Foundation
import CoreData
class Ingredients: NSManagedObject {
@NSManaged var ingredients: String
@NSManaged var relationship: NSSet
import Foundation
import CoreData
class Details: NSManagedObject {
@NSManaged var name: String
@NSManaged var relationship: Ingredients
}