AFNetworking JSON 到 UITableView - Objective-C

Posted

技术标签:

【中文标题】AFNetworking JSON 到 UITableView - Objective-C【英文标题】:AFNetworking JSON to UITableView - Objective-C 【发布时间】:2013-06-06 21:41:49 【问题描述】:

我正在开发我的第一个应用程序并开始将我的头撞到墙上。我创建了一个可以输出简单 JSON 的 C# Web API。我正在使用 AFNetworking 并获得有效响应(我相信),现在我想获取这个 JSON 对象并将其转换为 UITable。这是代码。

在我看来这是加载的。

- (void)viewDidLoad

    [super viewDidLoad];

    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"SMP" accessGroup:nil];
    NSString *password = [keychain objectForKey:(__bridge id)(kSecValueData)];
    NSString *username = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];

    [[APIClient sharedManager] setUsername:username andPassword:password];

    [[APIClient sharedManager] getPath:@"/api/leads_calls/?$top=5&$orderby=CallStart%20desc"parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
        self.leads_dict = responseObject;
        self.leads_calls = [[NSMutableArray alloc] init];
        [self.leads_calls addObject:self.leads_dict];

        NSLog(@"%@", self.leads_calls);

        [self.tableView setHidden:NO];
        [self.tableView reloadData];

     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        // error stuff here
    ];

我可以在以下代码中设置断点,然后抛出异常:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    

    if (self.leads_calls > nil) 
         // Here is where I get the exception
         cell.textLabel.text = [[self.leads_calls objectAtIndex:indexPath.row] objectForKey:@"CallerName"];
    
    return cell;

最后,我的数组在异常发生时如下所示:

2013-06-06 14:32:11.372 SMP[39846:c07] (
        (
        
            CallEnd = "2013-06-06T12:20:26";
            CallStart = "2013-06-06T12:11:56";
            CallerName = "xx & xx";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1134514;
        ,
        
            CallEnd = "2013-06-06T11:36:41";
            CallStart = "2013-06-06T11:07:43";
            CallerName = "Las xx    NV";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1134333;
        ,
        
            CallEnd = "2013-06-04T13:09:00";
            CallStart = "2013-06-04T12:58:36";
            CallerName = "xx LAW FI";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1129882;
        ,
                
            CallEnd = "2013-06-03T16:43:31";
            CallStart = "2013-06-03T16:32:32";
            CallerName = "xx xx";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1127940;
        ,
                
            CallEnd = "2013-06-03T07:46:16";
            CallStart = "2013-06-03T07:44:23";
            CallerName = "xx x";
            CallerNo = xxxxxxxxxx;
            Handled = 0;
            ID = 1125648;
        
    )
)

我会不顾一切地猜测 cell.textLabel.text 正在获得一个它没有预料到的值,但我不知道如何解决这个问题。

【问题讨论】:

什么是崩溃? '[self.leads_calls objectAtIndex:indexPath.row]' 有效吗?它返回什么? [__NSCFArray objectForKey:]:无法识别的选择器发送到实例 0x758fb60 那么 NSLog(@"%@", self.leads_calls); 的输出是什么? ? 这正是上面最后一个代码块中写的内容 【参考方案1】:

我认为你的数组中只有一个 NSDictionary 对象,而不是很多。

您尝试在UILabel 上设置的text 属性肯定不是NSString,因为它应该是。

responseObject 的类是什么?

找出来:

NSLog(@"%@", [responseObject class]);

或在调试器中:

po [responseObject class]

还有:

self.leads_calls > nil 在 Objective-C 中不是一个通用的约定。 self.leads_calls.count > 0更好

编辑

好的,废弃字典leads_dict 并执行self.leads_calls = responseObject

然后在cellForRowAtIndexPath 做:

cell.textLabel.text = [[self.leads_calls objectAtIndex:indexPath.row] objectForKey:@"CallerName"];

正如你已经知道的那样(在我输入 ha 后意识到)

编辑 2

你需要实现UITableViewDelegate方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return self.leads_calls.count;

确保只有在 UITableView 中创建的单元格数与数组中的对象数相匹配。

如果我是你,我也会考虑为你的响应对象创建一个模型类,它也许会让你以后的生活更轻松。

【讨论】:

响应对象的类是:__NSCFArray,有意思……AFNetworking会返回一个数组给我吗? ... 如果是这种情况,我该如何存储该数组并在 UItableView cell.textlabel.text 中使用它? 检查我的编辑,我想我会帮你破解的。这完全取决于您混淆的数据类型。回答你的另一个问题:AFNetworking 返回一种 id 类型,它可以是从 NSObject 继承的任何对象,我不确定通常返回什么对象类。猜猜它对于不同的响应类型是不同的。 感谢您的帮助...我们现在开始了。我现在有一个不同的问题...我收到此错误:[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 当我调用 tableview reload 您正在尝试访问不在数组中的对象(数组有 3 个对象,您正在尝试访问第 4 个对象)确保您没有通过实施我更新的答案。 【参考方案2】:

很难看,但是你有字典和数组:

2013-06-06 14:32:11.372 SMP[39846:c07]
(
    (
        

注意有 2 个圆括号...

所以,leads_dict 并不是真正的字典,它是一个字典数组。同时拥有leads_dictleads_calls 似乎有点矫枉过正,删除其中一个。确保左边是一个数组,并使用它来驱动您的表格视图。

【讨论】:

太棒了,我解决了这个问题,现在我在 tableview reloadData 上遇到了异常。索引超出范围,我不确定为什么会这样 如果我只从我的网址请求 1 个结果,我的索引不会超出范围。我把它设置为 5,它超过了 3。你知道有什么方法可以解决这个问题吗?我可以预先调整我的索引大小吗?

以上是关于AFNetworking JSON 到 UITableView - Objective-C的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 将 [] 方括号添加到发送到服务器的 json

使用 AFNetworking 2 将 Json 数组发送到服务器时出错

JSON到带有AFNetworking的NSMutableArray [重复]

AFNetworking JSON 到 UITableView - Objective-C

AFNetworking 1.x 将 JSON 发布到 PHP

AFNetworking 2.0 图片上传和 JSON 返回错误