Iphone 检测核心数据中的字符串或整数
我从Core Data Books示例中为我的应用程序内置了一些核心数据支持。该示例使用日期和字符串。但是,我尝试添加添加和编辑整数值的功能Iphone 检测核心数据中的字符串或整数,iphone,objective-c,ipad,core-data,Iphone,Objective C,Ipad,Core Data,我从Core Data Books示例中为我的应用程序内置了一些核心数据支持。该示例使用日期和字符串。但是,我尝试添加添加和编辑整数值的功能 //If the value is a string if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSString class]]) { textField.hidden = NO; datePicker.hidden = YES;
//If the value is a string
if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSString class]]) {
textField.hidden = NO;
datePicker.hidden = YES;
textField.text = [editedObject valueForKey:editedFieldKey];
textField.placeholder = self.title;
[textField becomeFirstResponder];
}
//If the value is a number
else {
textField.hidden = NO;
datePicker.hidden = YES;
textField.text = [[editedObject valueForKey:editedFieldKey] stringValue];
textField.placeholder = self.title;
[textField becomeFirstResponder];
}
第一个if语句是示例代码中的if语句(没有检查它是否是字符串,我添加了它),我添加了else语句,当它不是字符串而是整数时运行。但是,现在当我编辑字符串时,它会跳过if语句,因此:if([[editedObject valueForKey:editedFieldKey]有点类:[NSString类]])
这一行不知何故不起作用
如果你看一下苹果的CoreDataBooks示例,我的代码是一样的,只是我添加了一个接受整数16的字段
编辑
当在第一个if语句上放置断点并在控制台中返回po[editedObject valueForKey:EditedFiledKey]
时,我得到:无法打印NIL对象的描述。
我想这是因为它是在物体制造之前?当视图出现时会发生这种情况(视图需要输入新字符串)
按下“保存”按钮后,此代码将运行:
- (IBAction)save {
// Set the action name for the undo operation.
NSUndoManager * undoManager = [[editedObject managedObjectContext] undoManager];
[undoManager setActionName:[NSString stringWithFormat:@"%@", editedFieldName]];
// Pass current value to the edited object, then pop.
if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSString class]]) {
[editedObject setValue:textField.text forKey:editedFieldKey];
}
else {
[editedObject setValue:[NSNumber numberWithInteger:[[textField text] integerValue]] forKey:editedFieldKey];
}
[self.navigationController popViewControllerAnimated:YES];
}
当它运行时,它跳过第一个if语句并运行else语句,然后崩溃并显示错误:属性的值类型不可接受:property=“firstName”;所需类型=NSString;给定类型=uu NSCFNumber;值=0。
firstName
是我的数据模型中的字符串属性。我猜是因为第一个if语句失败了,它的前向应该是一个整数?我真的不确定。我用更多的核心数据应用解决了同样的问题。我还修改了核心数据书应用程序。如果您注意到,在原始应用程序中,他们使用BOOL变量(editingDate
)来决定是否显示日期选择器。我创建了第二个BOOL变量('editingTextView'),并根据需要编辑的内容更改这些BOOL变量。这可能不是最有效的方法,但它很容易编程,也很容易遵循核心数据手册中已有的内容。好的,基于调试器中的值为nil
,让我解释一下发生了什么。在Objective-C中,发送到nil
对象的任何消息都不会执行任何操作,然后返回nil
(其内存值恰好与0
和false
和NO
相同)
所以你要这么做:
if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSString class]]) {
如果editedObject
为nil
,则valueForKey
将不执行任何操作并返回nil
。然后您将iskindof类
发送到nil
,它也将不执行任何操作并返回nil
。在if语句中,nil
将计算为NO
,将您发送到else
语句
在执行此操作时:
textField.text = [[editedObject valueForKey:editedFieldKey] stringValue];
editedObject
是nil
,级联到stringValue
返回nil
,因此您试图将文本字段的值设置为nil
,这是无效的,将使您的应用程序崩溃
解决方案是重新构造代码以检查nil
。下面是我将如何编写您的代码:
// don't do anything for a nil value note this will detect editedObject being nil, or the result of valueForKey: being nil.
if (![editedObject valueForKey:editedFieldKey]) {
return;
}
// figure out the string value
NSString *textFieldValue = [editedObject valueForKey:editedFieldKey];
if ([textFieldValue isKindOfClass:[NSNumber class]]) {
textFieldValue = [(NSNumber *)textFieldValue stringValue]
}
// update the text field
textField.hidden = NO;
datePicker.hidden = YES;
textField.text = textFieldValue;
textField.placeholder = self.title;
[textField becomeFirstResponder];
editedObject
来自哪里?可能该值不是字符串。你应该在那一行代码上设置一个断点,然后运行po[editedObject valueForKey:editedFieldKey]
来查看它是什么。检查我的编辑,我发布了一些结果。我认为这会起作用,这很有意义。不过我会保留代码,因为它看起来更符合逻辑。然而,我仍然得到同样的崩溃和错误。