错误的EXC访问检查是否存在数据:SWIFT

错误的EXC访问检查是否存在数据:SWIFT,swift,ios8,exc-bad-access,managedobjectcontext,Swift,Ios8,Exc Bad Access,Managedobjectcontext,我有一个有数据的UITableViewController。如果您点击该行,您可以编辑现有数据;如果您点击UIBarButtonItem中的+,您可以添加新信息。当我的Segue传递核心数据对象(vc.managedObjectID)时,我的“细节”视图控制器会检查firstName字段是否有数据 在Objective-C中,我会这样做 - (void)refreshInterface { CoreDataHelper *cdh = [CoreDataHelper sharedHelpe

我有一个有数据的
UITableViewController
。如果您点击该行,您可以编辑现有数据;如果您点击
UIBarButtonItem
中的+,您可以添加新信息。当我的Segue传递核心数据对象(vc.managedObjectID)时,我的“细节”视图控制器会检查firstName字段是否有数据

在Objective-C中,我会这样做

- (void)refreshInterface
{
    CoreDataHelper *cdh = [CoreDataHelper sharedHelper];
    Cues *existingCues = (Cues*)[cdh.context existingObjectWithID:_cuesNSManagedObjectID error:nil];

    if (!existingCues.cuesName)
    {
        _cueNameTextField.text           = nil;
        self.cueDescriptionTextView.text = nil;
    }
    else
    {
        _cueNameTextField.text           = existingCues.cuesName;
        self.cueDescriptionTextView.text = existingCues.cuesDescription;
    }
}

我在检查firstName中是否有任何数据时遇到问题:var firstName=playerInformation.firstName仅在添加新对象时(意味着playerFormatin为空)才会导致EXC_BAD_访问,当我点击查看现有数据时,它会返回正确的数据。如何检查播放器信息是否为空(新记录)或Swift中是否有数据(现有数据)

func refreshInterface(){

    if managedObjectID != nil {
        var playerInformation = managedObjectContext?.existingObjectWithID(managedObjectID!, error: nil) as? PlayerInformation

        var firstName = playerInformation!.firstName //EXC_BAD_ACCESS
        println("firstName \(firstName)")
    }
}
准备工作

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "addPlayerInformationDetail" {

            println("addPlayerInformationDetail")

            let context = self.fetchedResultsController.managedObjectContext

            let entity  = self.fetchedResultsController.fetchRequest.entity

            let playerInformation = NSEntityDescription.insertNewObjectForEntityForName(entity.name, inManagedObjectContext: managedObjectContext!) as PlayerInformation?

            var vc  = segue.destinationViewController as PlayerInformationDetailTableViewController

            vc.managedObjectID = playerInformation?.objectID

        } else if segue.identifier == "editPlayerInformationDetail" {


            println("editPlayerInformationDetail")

            var indexPath:NSIndexPath = tableView.indexPathForSelectedRow()!

            var vc                    = segue.destinationViewController as PlayerInformationDetailTableViewController

            vc.managedObjectID        = self.fetchedResultsController.objectAtIndexPath(indexPath).objectID

        }

您可以像这样使用条件
let

if let firstName = playerInformation?.firstName {
    println("firstName \(firstName)")
}

只有当可选值不是零时,这才会打开可选值,以避免崩溃。

出于某种原因,这会起作用:

var playerInformation = managedObjectContext?.existingObjectWithID(managedObjectID!, error: nil)
var firstName: AnyObject? = playerInformation?.valueForKey("firstName")
println("firstName \(firstName)")

如果我将managedObjectContext子类化为PlayerInformation,我将获得EXC_BAD_访问权

如果让firstName=PlayerInformation?.firstName{println(“firstName\(firstName)”)}
条件导致EXC_BAD_ACCESS@PaulS. 有趣。如果让p=playerInformation{var firstName=p.firstName println(“firstName\(firstName)”)}在
var firstName
行上执行错误访问,请尝试
。在变量视图(左下角的调试窗格)
firstName=(String)“
firstName的声明类型是什么?是
NSString?PlayerInformation是一个NSManagedObject,firstName是一个字符串。同样,当我运行应用程序并选择一个包含数据的UITableView单元格时,即使您建议的代码也可以找到,并且会打印出名字。这会导致EXC\u BAD\u访问失败