2011-12-11 26 views
1

我已经在核心数据手册示例中为我的应用程序内置了一些核心数据支持。该示例使用日期和字符串。不过,我已经尝试添加添加和编辑整数值的功能。核心数据检测字符串还是整数?

//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语句是示例代码(不检查其字符串,我补充说),我增加了else语句运行时,它不是一个字符串,但一个整数。它可以工作,但是现在当我编辑一个字符串时,它会跳过if语句,所以行:if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSString class]])不能以某种方式工作。

希望你能帮上忙。让我知道如果你需要更多继续。如果你看一下苹果的CoreDataBooks例子,我的代码是一样的,只是我添加了一个字段,它需要一个整数16.

编辑:

将在第一个if语句并返回po [editedObject valueForKey:EditedFiledKey]断点时在控制台中,我得到:Can't print the description of a NIL object.

我认为这是因为它在对象被创建之前?当视图出现时(输入新字符串的视图)会发生这种情况。

其在按下保存按钮,这个代码运行:

- (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语句,然后崩溃,并显示错误:Unacceptable type of value for attribute: property = "firstName"; desired type = NSString; given type = __NSCFNumber; value = 0.

firstName是我的数据模型中的字符串属性。我猜是因为第一个if语句失败,它的前进期望一个整数?我真的不确定。

+0

哪里'editedObject'从何而来?也许这个价值不是一个字符串。您应该在该行代码上设置一个断点,然后运行'po [editedObject valueForKey:editedFieldKey]'来查看它是什么。 –

+0

检查我的编辑,我发布了一些结果。 –

回答

0

我用更多的Core Data应用程序解决了同样的问题。我也修改了Core Data Books应用程序。如果您注意到,在原始应用中,他们使用BOOL变量(editingDate)来决定是否显示日期选择器。我创建了第二个BOOL变量('editingTextView`),并根据需要编辑的内容更改这些BOOL变量。它可能不是最有效的方式,但编程容易,并且易于遵循Core Data Books中已有的内容。

2

好的,所以根据调试器中的值nil,让我解释发生了什么。在Objective-C中,任何发送到nil对象的消息都不会执行任何操作,然后返回nil(它恰好与0falseNO具有完全相同的内存值)。

所以,你这样做是:

if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSString class]]) { 

如果editedObjectnil,则valueForKey不会做任何事情,并返回nil。然后你发送isKindOfClassnil这也将无所作为,并返回nil。在if语句中,nil将评估为NO,将您发送到else声明。

如果你这样做:

textField.text = [[editedObject valueForKey:editedFieldKey] stringValue]; 

editedObjectnil,级联到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]; 
+0

认为这将工作,使很多道理。我会保留这些代码,因为它似乎更符合逻辑。不过,我仍然遇到同样的崩溃和错误。 –

相关问题