错误的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访问失败