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_dict
和leads_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