【问题标题】:Core Data value accessing error in swiftswift中的核心数据值访问错误
【发布时间】: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

在阅读了一些 StackOverflow 问题后,我将此代码添加到我现有的 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的第二、第三和第四行。我们需要知道的是与这些行相关的崩溃消息。

标签: ios uitableview core-data swift


【解决方案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 对象的字符串列表

杰克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2014-08-15
    相关资源
    最近更新 更多