[英]AFNetworking JSON to UITableView - Objective-C
我正在开发我的第一个应用程序,并且开始把头撞在墙上。 我创建了一个C#Web API,它吐出了简单的JSON。 我正在使用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会得到一个意料之外的值,但是我不确定如何解决这个问题。
我认为您的数组中只有一个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中创建的单元格数量与数组中的对象数量匹配。
如果您是我,我也会考虑为您的响应对象创建一个模型类,这也许会使您的生活变得更轻松。
痛苦不堪,但您有字典,并且在数组中有数组:
2013-06-06 14:32:11.372 SMP[39846:c07]
(
(
{
注意有2个圆括号...
因此, leads_dict
并不是真正的字典,它是一系列字典。 同时拥有leads_dict
和leads_calls
似乎leads_calls
过头了,请删除其中之一。 确保剩下的一个是数组,并使用该数组来驱动表视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.