Ios 尝试保存核心数据对象时出错
我一直在尝试建立一个简单的应用程序,它允许用户用价格和找到价格的商店来更新食品。我所知道的主要问题是试图将Swift与Objective-C融为一体,尽管苹果公司还没有为Swift解决问题,而且它一直在变化 无论如何,我已经设置了我的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>
允许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]
// ...