无法访问NSManagedObject子类的属性(导致EXC_BAD_ACCESS)

5

我是一名Swift中的Core Data新手。我有一个单独的NSManagedObject类,它看起来像这样:

import Foundation
import CoreData

class Polls: NSManagedObject {

@NSManaged var title: String
@NSManaged var pollDescription: String

}

在一个UITableViewController子类中,我有一个获取这些对象的方法,如下所示:
func refreshPolls()
{
    //do the query to populate the array
    let req = NSFetchRequest(entityName: "Polls")
    self.polls = self.managedObjectContext?.executeFetchRequest(req, error: nil) as! [Polls]
    println(polls.count)
}

请注意,self.polls 被定义为 "Polls" 对象的数组。
现在,在 cellForRowAtIndexPath: 中,我只是这样做:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell
    if indexPath.row==0
    {
        cell = tableView.dequeueReusableCellWithIdentifier("EditPollCell") as! UITableViewCell
    }
    else
    {

        let poll:Polls = self.polls[indexPath.row-1] as Polls
        //println(poll.title) //fails with EXC_BAD_ACCESS

        cell  = tableView.dequeueReusableCellWithIdentifier("PollCell") as! UITableViewCell
        //cell.textLabel?.text = (poll.valueForKey("title") as! String)


    }

    return cell

那个被注释的 println 由于 EXC_BAD_ACCESS 而失败了。没有额外的错误信息,而在 Polls 类的属性中添加 "dynamic" 也没有任何区别。

为什么我无法访问 Polls 对象的属性?使用 valueForKey 方法会失败并显示消息 "Unexpectedly found a nil value when unwrapping an optional",尽管 title 属性有一个值。

1个回答

3
我假设你的Polls数组是NSManagedObject数组。为了验证这一点,请尝试替换以下内容:
//println(poll.title) //fails with EXC_BAD_ACCESS

使用

println(poll.valueForKey("title"))

如果这有所帮助,您可以查看此答案

CoreData:警告:无法加载命名的类


我按照你提供问题的第一个答案建议将实体重命名为单数形式(Poll而不是Polls),然后问题消失了。 我不知道为什么会这样。 你能否提供一些见解?我没有在我的类中使用@objc()注释。为什么改变名称可以解决这个问题? - tutiplain
@tutiplain,你是否也将类名从“Current Product Module.Polls”更改为简单的“Poll”? - Vitalii Gozhenko
我现在在另一个视图控制器上遇到了同样的问题。该类名为PollMaster.Poll。PollMaster是应用程序名称,这没有改变。我现在遇到问题的第二个视图控制器显示EXC_BAD_INSTRUCTION,并访问相同的属性。 - tutiplain
嗯,你能分享一下在第二个视图控制器中如何获取“Poll”对象的代码吗? - Vitalii Gozhenko
嗨,经过仔细调试我的代码后,我发现第二个视图控制器的问题与我发送了一个空值有关,而不是与发送Core Data对象有关。最终我能够像这样发送到另一个视图控制器: var PollDet:PollDetailsViewController=self.storyboard?.instantiateViewControllerWithIdentifier("PollDetailsViewController") as! PollDetailsViewController PollDet.setPoll(self.polls[indexPath.row-1]) self.navigationController?.pushViewController(PollDet, animated: true) - tutiplain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接