UITableView 不显示来自 responseObject 的数据
Posted
技术标签:
【中文标题】UITableView 不显示来自 responseObject 的数据【英文标题】:UITableView doesn't show data from responseObject 【发布时间】:2015-12-15 14:54:15 【问题描述】:我试图在TableView
中显示responseObject
,但没有显示。我可以打印出所有responseObject
的值,但在运行应用程序时TableView
中没有显示任何内容。在 .m 文件中,我在 ViewDidLoad 中有这个:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Bearer %@",access_token] forHTTPHeaderField:@"Authorization"];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
//NSLog(@"Info: %@", responseObject);
dataArray = [[NSArray alloc]initWithObjects:responseObject, nil];
//[self.tableViewObject reloadData];
self.tableViewObject.dataSource = self;
self.tableViewObject.delegate = self;
NSLog(@"TableView: %@", _tableViewObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
如果我取消注释 [self.tableViewObject reloadData];
它会给我这个错误:
libc++abi.dylib:以未捕获的类型异常终止 NSException
我在 .m 文件中的 tableView
看起来像:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [dataArray count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellId = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (cell == nil)
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId];
cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
return cell;
.h 文件如下所示:
#import <UIKit/UIKit.h>
@interface MyCardsVC : UIViewController<UITableViewDataSource,UITableViewDelegate>
NSArray *dataArray;
@property (weak, nonatomic) IBOutlet UITableView *tableViewObject;
@end
我不知道我做错了什么。我应该正确连接它...
【问题讨论】:
【参考方案1】:你还没有分配任何数据源和委托,你现在正在重新加载 tableView 你必须先分配 dataSource 然后重新加载 TableView 像这样
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Bearer %@",access_token] forHTTPHeaderField:@"Authorization"];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
//NSLog(@"Info: %@", responseObject);
dataArray = [[NSArray alloc]initWithObjects:responseObject, nil];
self.tableViewObject.dataSource = self;
self.tableViewObject.delegate = self;
[self.tableViewObject reloadData];
NSLog(@"TableView: %@", _tableViewObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
希望对你有帮助。
【讨论】:
查看上面的链接@MuhammadWaqasBhati 你能添加所有异常断点并检查它在哪一行崩溃如果你还不知道添加所有异常断点,请检查此链接***.com/questions/17802662/… @MarckKühme 你有另一个错误(它不是数据源或委托错误)请你添加到你的问题 NSLog(@"Info: %@", responseObject) 因为如果我们看到你收到的我们可以帮助你 你的错误在cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
。您的 dataArray
包含 responseObject
这是一个数组。您不能直接将数组转换为字符串。尝试先登录responseObject
。
嗯,我不知道如何使用它。我尝试使用self.tableViewObject.dataSource = self;
、self.tableViewObject.delegate = self;
和[self.tableViewObject reloadData];
设置断点【参考方案2】:
首先,您需要按照Muhammad Waqas Bhati 的建议修改您的请求代码。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Bearer %@",access_token] forHTTPHeaderField:@"Authorization"];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
//NSLog(@"Info: %@", responseObject);
dataArray = [[NSArray alloc]initWithObjects:responseObject, nil];
self.tableViewObject.dataSource = self;
self.tableViewObject.delegate = self;
[self.tableViewObject reloadData];
NSLog(@"TableView: %@", _tableViewObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
由于您只想在单元格中显示 card1..cardn,您应该将您的 cellForRowAtIndexPath
修改为这样。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellId = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (cell == nil)
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId];
NSDictionary *objectDict = [dataArray objectAtIndex:indexPath.row];
/* if you want the label to follow card state, use the first cell.textLabel.text option
if you prefer using table view row, use the second cell.textLabel.text
*/
cell.textLabel.text = [NSString stringWithFormat:@"Card%d", [objectDict valueForKey:@"cardState"]];
//cell.textLabel.text = [NSString stringWithFormat:@"Card%d", indexPath.row];
return cell;
下一步是实现didSelectRowAtIndexPath
委托。
当您点击单元格时使用此委托,因为您要打开新页面,新页面必须知道正在点击的单元格及其包含的信息。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSDictionary *objectDict = [dataArray objectAtIndex:indexPath.row];
NSLog(@"%@", objectDict);
// Pass object to new page
如果您不确定如何在视图之间传递变量,this 可以帮助您。
【讨论】:
我正在做的类,它必须是 ViewController og TableViewController 吗? @SetoNugroho 嗯,我不知道如何连接插座以获得输出。我创建了一个 UITableViewControllerMCTVC
并且看起来像这样:@interface MCTVC : UITableViewController<UITableViewDataSource,UITableViewDelegate> NSArray *dataArray; @property (strong, nonatomic) IBOutlet UITableView *tableViewObject; @end
但它总是让我遇到和以前一样的错误..@SetoNugroho
在我的代码中我尝试打印出NSLog(@"TableView: %@", _tableViewObject);
然后我得到这个输出:<UITableView: 0x7f95ba070000; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7f95b9ca0bc0>; animations = position=<CASpringAnimation: 0x7f95b9c1ef20>; ; layer = <CALayer: 0x7f95b9c16b60>; contentOffset: 0, 0; contentSize: 320, 0>
@SetoNugroho
你为什么要打印你的_tableViewObject
?您是否在新视图控制器中创建了 NSDictionary
对象?
不,因为我认为问题不存在。似乎我从未涉足:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
和 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
@SetoNugroho以上是关于UITableView 不显示来自 responseObject 的数据的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 UITableView 不执行 show segue,只显示模态
iOS 在 UITableView 中显示来自 ALAsset 的图像