UITableView不会显示来自responseObject

时间:2015-12-15 14:54:15

标签: ios objective-c uitableview afnetworking-2

我试图在responseObject中显示TableView,但没有显示任何内容。我可以打印出所有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

我不知道自己做错了什么。我应该把它连接好......

2 个答案:

答案 0 :(得分:0)

  

你还没有分配任何数据源和委托,你现在正在重新加载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);
}];

希望它会对你有所帮助。

答案 1 :(得分:0)

首先,您需要按照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可以帮助您。