【问题标题】:Populate UILabel in TableView Cell with returned JSON使用返回的 JSON 填充 TableView 单元中的 UILabel
【发布时间】:2016-02-02 18:44:03
【问题描述】:

我正在尝试将 JSON 数据从字段“field_message_subject”和“field_message_body”拉到我的应用程序中的表格单元格中。我正在使用以下代码来执行此操作,并且成功返回了数据,但是我的应用程序崩溃并且未填充标签。崩溃错误是:

由于未捕获的异常“NSRangeException”而终止应用程序,原因: '*** -[__NSArrayM objectAtIndex:]: 索引 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;
        }
    )

【问题讨论】:

标签: ios objective-c json uitableview


【解决方案1】:

根据您的 JSON 格式,访问 field_message_subject 应该类似于

 [[[[receivedSubjectLine objectForKey:@"field_message_subject"] objectForKey:@"und"] objectAtIndex:0] objectForKey:@"value"];

【讨论】:

  • 这看起来更接近我想要的,但是如何将单元格放在这一行中(我要填充的 UILabel 称为 subjectLine,它位于我的 TableView 单元格中)?
  • 像以前一样在 cellForRowAtIndexPath 中使用它。您可以将上述设置为一个名为 messageSubject 的 NSString,位于 NSDictionary *receivedSubjectLine = [self.messages objectAtIndex:indexPath.row] 下面。然后,[[cell subjectLine] setText:messageSubject].
【解决方案2】:

tableview 应该知道它需要多少个单元格。 定义这个 tableviewdatasource 方法来设置需要的行数。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.messages count];
}

顺便说一句,如果您增加行数,您应该在 viewDidLoad 中初始化 self.messages 并添加带有 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字段中写入文本

【讨论】:

  • 我添加了 return [self.messages count],但现在控制台向我抛出错误:*** 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[__NSCFDictionary 长度] :当我点击 ViewController 时,无法识别的选择器发送到实例 0x132b87040'...
  • 因为你的 field_message_subject 不是 NSString 它也是 NSDictionary
  • 所以我强调的那行代码不应该是这样的: ...objectForKey:@"und"] objectForKey:@"value"]; ?我只是不确定那行代码会是什么样子?
  • 例如,我之前已经将此数据拉到 UILabel 中,只是没有拉到 tableview 单元格中,它看起来像: self.messages.text = [[[[[self.cmets objectAtIndex:0] ] objectForKey:@"comment_body"] objectForKey:@"und"] objectAtIndex:0] objectForKey:@"value"];
  • 尝试了您的编辑 - 不会使我的应用崩溃,但标签为空... :) ? field_message_subject 不包括在内?
【解决方案3】:

您正在将response(即NSDictionary)添加到self.messages。在您的代码中没有其他地方您要插入self.messages。因此messages 数组将始终保存一个值。您正在尝试从 messages 数组中获取行索引处的对象。因此,如果行数超过 1,您的应用将崩溃,因为 messages 仅包含 1 个对象。

【讨论】:

  • 目前,我已将 tableView 设置为只返回一行?
  • 您的崩溃消息说它正在尝试访问索引 1,这将是您表中的第二行。你确定你只告诉它有 1 行吗?
  • 我已将其更改为:我已添加 return [self.messages count];但是我上面突出显示的块在检索指定字段时不应该看起来不同吗?例如。类似于: ...objectForKey:@"und"] objectForKey:@"value"]; ?我只是不确定那行代码会是什么样子?
猜你喜欢
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多