0

下面的代码NSMutableArray从一个对象中获取值,从一个对象中获取值,然后将它们添加到另一个对象中NSMutableArray以供使用。我需要做的是为每个项目添加一个新行,NSMutableArray *options但它崩溃说:

[__NSSingleObjectArrayI 长度]:发送到实例的无法识别的选择器

如果我注释掉 中的代码for (int i = 0; i < options.count; i++)并留下NSLog(@"FIELD)它,它会显示正确的值。有任何想法吗?

LFFormSectionLabel *sectionLabel = [LFFormSectionLabel new];
[sectionLabel addValue:header forSEL:@selector(setText:)];
[vc addSection:sectionLabel];

NSMutableArray *options = [[NSMutableArray alloc] init];
for (NSDictionary *item in self.surveydata) {
    NSString *addressfield = [item objectForKey:@"address_option"];
    [options addObject:addressfield];
}

for (int i = 0; i < options.count; i++) {
    NSString *field = [options objectAtIndex:i];
    LFFormRowTextField *rowTextField = [LFFormRowTextField new];
    rowTextField.key = @"name";
    [rowTextField addValue:field forSEL:@selector(setPlaceholder:)];
    [sectionLabel addRow:rowTextField];

    NSLog(@"FIELD: %@", field);
}
4

2 回答 2

0

这不是一个真正的答案,只是为了帮助您调试。NSLog 非常适合帮助调试代码。在这些行添加以下 NSLog 并亲自查看它们的内容。

NSMutableArray *options = [[NSMutableArray alloc] init];
for (NSDictionary *item in self.surveydata) {
    NSString *addressfield = [item objectForKey:@"address_option"];
    NSLog("addressfield :%@",addressfield); // HERE
    [options addObject:addressfield];
}
NSLog("options:%@",options);// HERE

for (int i = 0; i < options.count; i++) {
    NSString *field = [options objectAtIndex:i];
    LFFormRowTextField *rowTextField = [LFFormRowTextField new];
    rowTextField.key = @"name";
    [rowTextField addValue:field forSEL:@selector(setPlaceholder:)];
    [sectionLabel addRow:rowTextField];

    NSLog(@"FIELD: %@", field);
}

您的代码有一些缺陷。例如,如果 addressfield 没有返回 NSString,而是返回 NULL 或 NSNumber 或其他值怎么办?好的做法是在分配之前始终检查从 objectForKey 返回的对象的类型。除非你能保证数据只包含字符串。如果它来自第 3 方 Web API,那么我几乎可以说各种垃圾都会被发送。:D 祝你好运。

于 2019-01-09T05:47:31.033 回答
0

最有可能的是,数组中的对象实际上根本不是 NSString,它们是包含 NSString 的 NSArray。尝试在 objectAtIndex 调用后停止调试器并打印 [field class]

于 2019-01-09T01:07:06.653 回答