Ios 用CoreData存储

Ios 用CoreData存储,ios,uitableview,core-data,Ios,Uitableview,Core Data,我的应用程序非常简单:我有一个tableview来存储配方*名称,对于每个配方名称,还有一个tableview,其中包含每个配方的若干*成分 我已经用CoreData保存了名称和配料,但问题是:当我按下添加新配方名称并进入配料表视图区域时,为上一个配方保存的配料就在那里!如何清除表格视图以启动新的表格视图 此外,我的表视图不会立即更新,我必须关闭应用程序并再次打开它。我怎么修理它 注意:如果我的问题太难理解,我可以发布一些代码!提前谢谢大家=) 编辑 代码: - - - 和型号: import

我的应用程序非常简单:我有一个tableview来存储配方*名称,对于每个配方名称,还有一个tableview,其中包含每个配方的若干*成分

我已经用CoreData保存了名称和配料,但问题是:当我按下添加新配方名称并进入配料表视图区域时,为上一个配方保存的配料就在那里!如何清除表格视图以启动新的表格视图

此外,我的表视图不会立即更新,我必须关闭应用程序并再次打开它。我怎么修理它

注意:如果我的问题太难理解,我可以发布一些代码!提前谢谢大家=)

编辑

代码:

-

-

-

和型号:

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)
  • 在切换到此VC之前,您需要设置
    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
    
    }