Swift - 核心数据属性EXC访问不良

时间:2015-04-10 02:35:35

标签: ios uitableview swift core-data

我有一个Swift应用,我尝试使用NSFetchedResultsController填充四个单独的tableviews,它们位于主VC内的容器中,使用从父自定义tableview控制器类继承。我有一个定义了这个方法的父类,我的所有子类都是继承的:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
    var task = fetchedResultsController.objectAtIndexPath(indexPath) as Task
    if task.isKindOfClass(Task) == true {
        cell.detailTextLabel?.text = task.name//EXC_BAD_ACCESS code=1
    }

    return cell
}

我评论了它给我EXC_BAD_ACCESS编译错误的行。 我知道从Task继承的NSManagedObject类对象成功存储在该变量中,但似乎每当我尝试访问name属性时(偶数println都会导致错误),或者对象的任何属性我得到这个编译错误。

我的预感是它与四个不同的tableviews同时尝试所有访问权限有关。我是Core Data的新手并不确定。

修改

可能有助于解决问题的更多代码:

let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext

var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController()

func getFetchedResultsController() -> NSFetchedResultsController {
    fetchedResultsController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
    return fetchedResultsController
}

func taskFetchRequest() -> NSFetchRequest {
    let fetchRequest = NSFetchRequest(entityName: "Task")
    let sortDescriptor = NSSortDescriptor(key: "priority", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]
    return fetchRequest
}

override func viewDidLoad() {
    super.viewDidLoad()

   fetchedResultsController = getFetchedResultsController()
    fetchedResultsController.delegate = self
    fetchedResultsController.performFetch(nil)

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

实体检查器的屏幕截图:

http://i.stack.imgur.com/Htyne.png

1 个答案:

答案 0 :(得分:0)

搞定了!一些事情:我的name属性为nil,因为我没有在模型检查器中设置默认值,并且需要默认值好的方法,但更重要的是:我的managedObjectContext在声明中没有用!打开,所以我没有在每次引用时解开它,所以有时我得到了可选({{ 1}})当我需要未包装的值时。那是managedObjectContext?  但它需要的是let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext。可选的问题,并没有充分意识到什么时候打开包装是我的垮台。我还删除了我的初始版let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!,因为在我更改了将默认值分配给app.sqlite的模型后,我遇到了一个问题。