我正在尝试将 JSON 数据从字段"field_message_subject"和"field_message_body"拉到我的应用程序中的表格单元格。我使用以下代码执行此操作,并且成功返回数据,但我的应用程序崩溃并且未填充标签。崩溃错误是:
由于未捕获的异常"NSRangeException"而终止应用程序,原因: '*** -[__NSArrayM 对象索引:]: 索引 1 超出边界 [0 .. 0]'
Viewcontroller.m
- (void)viewDidLoad {
[super viewDidLoad];
NSDictionary *entityData = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"1"] forKey:@"uid"];
[DIOSEntity
entityGet:entityData
name:@"entity_message"
eid:@"uid"
success:^(AFHTTPRequestOperation *op, id response) {
self.messages = [NSMutableArray arrayWithObject:(NSDictionary*)response];
dispatch_async(dispatch_get_main_queue(), ^(void){
[self.tableView reloadData];
});
}
failure:^(AFHTTPRequestOperation *op, NSError *err) { NSLog(@"failed to get data"); }
];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *PointsTableIdentifier = @"MyMessagesCell";
MyMessagesCell *cell = (MyMessagesCell *)[tableView dequeueReusableCellWithIdentifier:PointsTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyMessagesCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
NSDictionary *receivedSubjectLine = [self.messages objectAtIndex:indexPath.row];
[[cell subjectLine] setText:[receivedSubjectLine objectForKey:@"field_message_subject"]];
NSLog(@"Received message subject is here %@", receivedSubjectLine);
return cell;
}
请参阅下面返回的 JSON 格式:
2016-02-02 10:37:19.996 app[4208:1406692] Messages are as follows (
{
arguments = (
);
data = (
);
"field_message_body" = {
und = (
{
format = "<null>";
"safe_value" = "Testing message center";
value = "Testing message center";
}
);
};
"field_message_group_ref" = (
);
"field_message_subject" = {
und = (
{
format = "<null>";
"safe_value" = Testing;
value = Testing;
}
);
};
"field_message_user_ref" = (
);
language = en;
mid = 1;
"rdf_mapping" = (
);
timestamp = 1447260780;
type = "private_message";
uid = 1;
}
)
根据您的 JSON 格式,访问field_message_subject应该是这样的
[[[[receivedSubjectLine objectForKey:@"field_message_subject"] objectForKey:@"und"] objectAtIndex:0] objectForKey:@"value"];
表视图应该知道它需要多少个单元格。定义此表视图数据源方法以设置所需的行数。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.messages count];
}
顺便说一下,如果你增加行数,你应该在viewDidLoad
初始化你的self.messages,并添加带有h addObject:
的条目;
self.messages = [NSMutableArray arrayWithObject:(NSDictionary*)response];
因为这将始终为您的数组分配新空间,并且其大小将始终为 1。
编辑
NSDictionary *receivedSubjectLine = [self.messages objectAtIndex:indexPath.row];
NSArray * val = receivedSubjectLine[@"und"];
NSString *textToWrite = val[0][@"value"];
[cell.subjectLine setText:textToWrite];
在字段中写入文本value
您正在将response
(NSDictionary
)添加到self.messages
。代码中没有其他任何地方插入到self.messages
中。因此messages
数组将始终保存一个值。您正在尝试从数组中获取行索引处messages
对象。因此,如果行数大于 1,您的应用程序将崩溃,因为messages
只包含 1 个对象。