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中的核心数据值访问错误的主要内容,如果未能解决你的问题,请参考以下文章

登录时由多个用户访问的核心数据值(iOS Swift)

编辑核心数据会产生错误,此类与键的键值编码不兼容

swift中的核心数据

swift中的核心数据关系

Swift 访问 SwiftUI Init() 中的核心数据实体? (线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类