swift中的核心数据值访问错误
Posted
技术标签:
【中文标题】swift中的核心数据值访问错误【英文标题】:Core Data value accessing error in swift 【发布时间】:2014-09-03 04:35:01 【问题描述】:我正在使用 Core Data。执行 fetch 并重新加载后,UITableView 应用程序崩溃。
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell?
var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
tasks = self.fetchedResultsController.objectAtIndexPath(indexPath) as Tasks
cell.textLabel.text = tasks?.desc
return cell
我知道错误在这部分->
tasks = self.fetchedResultsController.objectAtIndexPath(indexPath) as Tasks
在阅读了一些 *** 问题后,我将此代码添加到我现有的 cellForRowAtIndexPath UITableView 委托方法中。
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell?
var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
var array : NSArray = self.fetchedResultsController.fetchedObjects as NSArray
cell.textLabel.text = array.valueForKeyPath("desc") as NSString
return cell
此时应用再次崩溃。
var array : NSArray = self.fetchedResultsController.fetchedObjects as NSArray
我用这个代码打印了这个
println(self.fetchedResultsController.fetchedObjects)
[<NSManagedObject: 0x16debcc0> (entity: Tasks; id: 0x16dd02f0 <x-coredata://A5AEB550-EB6D-4A47-9F6F-2F3AA49CA6BF/Tasks/p2> ; data:
desc = gghjg;
), <NSManagedObject: 0x16ebb1d0> (entity: Tasks; id: 0x16e8cda0 <x-coredata://A5AEB550-EB6D-4A47-9F6F-2F3AA49CA6BF/Tasks/p1> ; data:
desc = gxshli;
)]
我不知道这有什么问题。我按照本文Core Data Example中的步骤操作。
如果有人知道这有什么问题,请告诉我。谢谢。
这是崩溃报告的图片。
这是我的 ViewController 源文件类的完整代码。
import UIKit
import CoreData
class MaterTableViewController: UITableViewController, UIAlertViewDelegate, NSFetchedResultsControllerDelegate
var fetchedResultsController : NSFetchedResultsController = NSFetchedResultsController()
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
var tasks : Tasks? = nil
override func viewDidLoad()
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: Selector("insertNewObject"))
// Update the ViewDidLoad method of TableViewController to populate fetchedResultController variable and set the delegate to self and call the function to retrieve the results.
fetchedResultsController = getFetchedResultController()
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// MARK: - Core Data Methods
func insertNewObject()
if tasks != nil
self.editTasks()
else
var alertView : UIAlertView = UIAlertView()
alertView.title = "Add Note"
alertView.alertViewStyle = UIAlertViewStyle.PlainTextInput
alertView.addButtonWithTitle("Cancel")
alertView.addButtonWithTitle("Save")
alertView.delegate = self
alertView.show()
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int)
switch buttonIndex
case 0 : alertView .dismissWithClickedButtonIndex(buttonIndex, animated: true)
case 1 :
tempData = alertView.textFieldAtIndex(0).text
self.saveThisValue(tempData)
default : println("Nothin")
var tempData : NSString = NSString()
func editTasks()
tasks?.desc = tempData
managedObjectContext?.save(nil)
func saveThisValue(input : NSString)
let entityDescription = NSEntityDescription.entityForName("Tasks", inManagedObjectContext: managedObjectContext)
let task = Tasks(entity: entityDescription, insertIntoManagedObjectContext: managedObjectContext)
task.desc = input
managedObjectContext?.save(nil)
func getFetchedResultController() -> NSFetchedResultsController
fetchedResultsController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
return fetchedResultsController
func taskFetchRequest() -> NSFetchRequest
let fetchRequest = NSFetchRequest(entityName: "Tasks")
let sortDecriptor = NSSortDescriptor(key: "desc", ascending: true)
fetchRequest.sortDescriptors = [sortDecriptor]
return fetchRequest
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView!) -> Int
return fetchedResultsController.sections.count
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
return fetchedResultsController.sections[section].numberOfObjects
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell?
var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
tasks = self.fetchedResultsController.objectAtIndexPath(indexPath) as Tasks
cell.textLabel.text = tasks?.desc
return cell
func controllerDidChangeContent(controller: NSFetchedResultsController!)
fetchedResultsController.performFetch(nil)
tableView.reloadData()
【问题讨论】:
您有一个结果数组,但cellForRowAtIndexPath
仅用于一个结果 - 因此您需要使用indexPath.row
从数组中获取特定元素
@Paulw11 我试过了。但再次显示相同的错误。你能在这里发布一些代码吗?
您收到的崩溃消息是什么?
@Paulw11 我修改了问题,请给我您的反馈。
@Alvin Varghese:你的形象对我们帮助不大。当你的应用崩溃时,点击线程1的第二、第三和第四行。我们需要知道的是与这些行相关的崩溃消息。
【参考方案1】:
试试
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell?
var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
let task = self.fetchedResultsController.objectAtIndexPath(indexPath.row) as Tasks
cell.textLabel.text = task.desc
return cell
【讨论】:
我做到了。它在这一行显示错误 -> let task = self.fetchedResultsController.objectAtIndexPath(indexPath.row) as Tasks // NSNumber 不是 NSIndexPath 的子类型。【参考方案2】:我用过
let ob = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
var title : String = ob.valueForKey("keyname")!.description
在最近的应用程序中,标题是来自 NSManaged 对象的字符串列表
杰克
【讨论】:
以上是关于swift中的核心数据值访问错误的主要内容,如果未能解决你的问题,请参考以下文章
Swift 访问 SwiftUI Init() 中的核心数据实体? (线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)
iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类