Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 检测核心数据中的字符串或整数_Iphone_Objective C_Ipad_Core Data - Fatal编程技术网

Iphone 检测核心数据中的字符串或整数

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;

我从Core Data Books示例中为我的应用程序内置了一些核心数据支持。该示例使用日期和字符串。但是,我尝试添加添加和编辑整数值的功能

//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]
来查看它是什么。检查我的编辑,我发布了一些结果。我认为这会起作用,这很有意义。不过我会保留代码,因为它看起来更符合逻辑。然而,我仍然得到同样的崩溃和错误。