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 嗯,我不知道如何连接插座以获得输出。我创建了一个 UITableViewController MCTVC 并且看起来像这样:@interface MCTVC : UITableViewController&lt;UITableViewDataSource,UITableViewDelegate&gt; NSArray *dataArray; @property (strong, nonatomic) IBOutlet UITableView *tableViewObject; @end 但它总是让我遇到和以前一样的错误..@SetoNugroho 在我的代码中我尝试打印出NSLog(@"TableView: %@", _tableViewObject); 然后我得到这个输出:&lt;UITableView: 0x7f95ba070000; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = &lt;NSArray: 0x7f95b9ca0bc0&gt;; animations = position=&lt;CASpringAnimation: 0x7f95b9c1ef20&gt;; ; layer = &lt;CALayer: 0x7f95b9c16b60&gt;; contentOffset: 0, 0; contentSize: 320, 0&gt; @SetoNugroho 你为什么要打印你的_tableViewObject?您是否在新视图控制器中创建了 NSDictionary 对象? 不,因为我认为问题不存在。似乎我从未涉足:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath @SetoNugroho

以上是关于UITableView 不显示来自 responseObject 的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中显示来自 JSON 的数据

为啥我的 UITableView 不执行 show segue,只显示模态

iOS 在 UITableView 中显示来自 ALAsset 的图像

UITableView 中的第二个视图不会显示来自 JSON 的解析数据

UITableView显示和重新加载行为不同步

来自 UITableView 中的静态 UITableViewCell 的 UITextField 值未显示