Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 尝试保存核心数据对象时出错_Ios_Objective C_Core Data_Swift - Fatal编程技术网

Ios 尝试保存核心数据对象时出错

Ios 尝试保存核心数据对象时出错,ios,objective-c,core-data,swift,Ios,Objective C,Core Data,Swift,我一直在尝试建立一个简单的应用程序,它允许用户用价格和找到价格的商店来更新食品。我所知道的主要问题是试图将Swift与Objective-C融为一体,尽管苹果公司还没有为Swift解决问题,而且它一直在变化 无论如何,我已经设置了我的允许TableViewController,如下所示 class AllowedTableViewController: UITableViewController { var myAllowedList : Array<AnyObject>

我一直在尝试建立一个简单的应用程序,它允许用户用价格和找到价格的商店来更新食品。我所知道的主要问题是试图将Swift与Objective-C融为一体,尽管苹果公司还没有为Swift解决问题,而且它一直在变化

无论如何,我已经设置了我的
允许TableViewController
,如下所示

class AllowedTableViewController: UITableViewController {

    var myAllowedList : Array<AnyObject> = []

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(animated: Bool) {

        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let context: NSManagedObjectContext = appDel.managedObjectContext!
        let freq = NSFetchRequest(entityName: "FoodAllowed")

        myAllowedList = context.executeFetchRequest(freq, error: nil)!
        tableView.reloadData()
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "update" {

            var indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow()!
            var selectedItem: NSManagedObject = myAllowedList[indexPath.row] as NSManagedObject
            let IVC: AllowedViewController = segue.destinationViewController as AllowedViewController

            IVC.name = selectedItem.valueForKey("name")as String
            IVC.store = selectedItem.valueForKey("store")as String
            IVC.price = selectedItem.valueForKey("price")as String
            IVC.existingItem = selectedItem
            }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return myAllowedList.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //Configure the Cell

        let CellID: NSString = "Allowed"

        var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(CellID) as UITableViewCell


        var data: NSManagedObject = myAllowedList[indexPath.row] as NSManagedObject
            cell.textLabel.text = (data.valueForKeyPath("name")as String)

        var pri = data.valueForKeyPath("price")as String
        var str = data.valueForKeyPath("store")as String
        cell.detailTextLabel?.text = "\(pri) name/s - \(str)"
        return cell
    }

    //Override to support conditional editing of the table view
    override func tableView(tableView: UITableView?, canEditRowAtIndexPath indexPath: NSIndexPath?) -> Bool {
        //Return NO if you do not want the specified item to be editable
        return true
    }

    //Override to support editing the table view
    override func tableView(tableView: UITableView?, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath?) {

        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let context: NSManagedObjectContext = appDel.managedObjectContext!

        if editingStyle == UITableViewCellEditingStyle.Delete {

            if let tv = tableView {
            context.deleteObject(myAllowedList[indexPath!.row] as NSManagedObject)
            myAllowedList.removeAtIndex(indexPath!.row)
            tv.deleteRowsAtIndexPaths([indexPath!.row], withRowAnimation: UITableViewRowAnimation.Fade)
            }

            var error: NSError? = nil
            if !context.save(&error) {
                abort()
            }
        }       
    }
}
我的
NSManaged
数据模型是

{

@objc(DataModel)
class DataModel: NSManagedObject {

    //properties feeding the attributes in our entity
    //must match the entity attributes

    @NSManaged var name: [String]
    @NSManaged var store: [String]
    @NSManaged var price: [String]

}

}
当我在模拟器中运行应用程序时,我得到以下错误

'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "name"; desired type = NSString; given type = Swift._NSSwiftArrayImpl; value = (Apples).'

我做错了什么?

错误消息表明“name”、“store”和“price”是字符串属性 但您已将其定义为
[String]
,即数组 弦乐。应该是

@objc(DataModel)
class DataModel: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var store: String
    @NSManaged var price: String

}
因此

newItem.name = textFieldname.text // not: [textFieldname.text]
// ...
更好的是,让Xcode生成托管对象子类
(编辑器->在Xcode菜单中创建NSManagedObject子类…。

使用Swift的核心数据是否确保非可选始终合适?当然,声明为“可选”的核心数据属性应该有一个Swift可选类型aka“?”。“那”呢其他类型是否需要?(由于awakeFromNIB进程的缘故,它是针对IBOutlets的)@GoZoner:不幸的是,Xcode没有(仍然)为可选属性生成正确的代码,您必须添加!或手动。比较一下。非常感谢你的工作!复习的时候一定错过了!
newItem.name = textFieldname.text // not: [textFieldname.text]
// ...