raywenderlich 的 AFNetworking 教程不在表格单元格上显示数据

Posted

技术标签:

【中文标题】raywenderlich 的 AFNetworking 教程不在表格单元格上显示数据【英文标题】:AFNetworking tutorial of raywenderlich not displaying data on table cell 【发布时间】:2016-09-16 10:06:11 【问题描述】:

我正在学习使用 AFNetworking,

https://www.raywenderlich.com/59255/afnetworking-2-0-tutorial

但是,对于 json 部分,我没有在本教程中显示的单元格上显示数据。

我收到了 json 格式的响应,但之后单元格中没有显示任何内容。

    static NSString * const BaseURLString = @"http://www.raywenderlich.com/demos/weather_sample/";

    @interface WTTableViewController ()
    @property(strong) NSDictionary *weather;
    @end

    @implementation WTTableViewController

    - (id)initWithStyle:(UITableViewStyle)style
    
        self = [super initWithStyle:style];
        if (self) 
            // Custom initialization
        
        return self;
    

    - (void)viewDidLoad
    
        [super viewDidLoad];
        self.navigationController.toolbarHidden = NO;

        [self.tableView setDelegate:self];
        self.tableView.dataSource=self;
        // Uncomment the following line to preserve selection between presentations.
        // self.clearsSelectionOnViewWillAppear = NO;

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    

    - (void)didReceiveMemoryWarning
    
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    
        if([segue.identifier isEqualToString:@"WeatherDetailSegue"])
            UITableViewCell *cell = (UITableViewCell *)sender;
            NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

            WeatherAnimationViewController *wac = (WeatherAnimationViewController *)segue.destinationViewController;

            NSDictionary *w;
            switch (indexPath.section) 
                case 0: 
                    w = self.weather.currentCondition;
                    break;
                
                case 1: 
                    w = [self.weather upcomingWeather][indexPath.row];
                    break;
                
                default: 
                    break;
                
            
            wac.weatherDictionary = w;
        
    

    #pragma mark - Actions

    - (IBAction)clear:(id)sender
    
        self.title = @"";
        self.weather = nil;
        [self.tableView reloadData];
    

    - (IBAction)jsonTapped:(id)sender
    
        NSString *string = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
        NSURL *url = [NSURL URLWithString:string];
        //NSURLRequest *request = [NSURLRequest requestWithURL:url];

        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        [manager GET:string parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) 
            NSLog(@"JSON: %@", responseObject);
         failure:^(NSURLSessionTask *operation, NSError *error) 
            NSLog(@"Error: %@", error);

            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                                message:[error localizedDescription]
                                                               delegate:nil
                                                      cancelButtonTitle:@"Ok"
                                                      otherButtonTitles:nil];
            [alertView show];

        ];

    
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 2;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    if(!self.weather)
        return 1;

    switch (section) 
        case 0: 
            NSLog(@"return 1");
            return 1;
        
        case 1: 
            NSArray *upcomingWeather = [self.weather upcomingWeather];
            NSLog(@"return upcomingWeather");
            return [upcomingWeather count];
        
        default:
            return 0;
    


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"tableView");
    static NSString *CellIdentifier = @"WeatherCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


    NSDictionary *daysWeather = nil;

    switch (indexPath.section) 
        case 0: 
            daysWeather = [self.weather currentCondition];
            NSLog(@"currentCondition");
            break;
        

        case 1: 
            NSArray *upcomingWeather = [self.weather upcomingWeather];
            daysWeather = upcomingWeather[indexPath.row];
            NSLog(@"upcomingWeather");
            break;
        

        default:
            break;
    

    cell.textLabel.text = [daysWeather weatherDescription];
    NSLog(@"textLabel = %@", cell.textLabel.text);
    // Configure the cell...


    return cell;

我的表格视图控制器中有这段代码。

上述代码中的委托方法中使用了该方法:

- (NSDictionary *)currentCondition

    NSDictionary *dict = self[@"data"];
    NSArray *ar = dict[@"current_condition"];
    return ar[0];


- (NSArray *)upcomingWeather

    NSDictionary *dict = self[@"data"];
    return dict[@"weather"];

我收到 json 格式的响应,但单元格为空。 如果这里有什么遗漏,请参考教程。

谢谢。

【问题讨论】:

【参考方案1】:

在成功接收数据时,您只是打印数据。 您必须将该数据存储在字典中并重新加载 tableview。

使用下面的代码:

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:string parameters:nil progress:nil 
    success:^(NSURLSessionTask *task, id responseObject) 

        self.weather = (NSDictionary *)responseObject; //add this line
        [self.tableView reloadData];                   //add this line

     failure:^(NSURLSessionTask *operation, NSError *error) 
        NSLog(@"Error: %@", error);

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                            message:[error localizedDescription]
                                                           delegate:nil
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];

    ];

【讨论】:

谢谢。它的小变化,但我忘记了。它解决了我的问题。 @Divyesh Savaliya 你能描述一下如何使用 AFHTTPSessionManager 解析 plist。 @Divyesh Savaliya【参考方案2】:

您在成功块中缺少以下代码

    self.weather = (NSDictionary *)responseObject;
    self.title = @"JSON Retrieved";
    [self.tableView reloadData];

【讨论】:

你能描述一下如何使用 AFHTTPSessionManager 解析 plist。 @Sujit【参考方案3】:

在加载到tableview 之前,只需检查天气dict 中的数据是否存在,完成从服务器获取数据后,只需调用uitableViewreloadData 方法,以便稍后加载您的代码接收到的数据。

【讨论】:

以上是关于raywenderlich 的 AFNetworking 教程不在表格单元格上显示数据的主要内容,如果未能解决你的问题,请参考以下文章

AFNetwork、Magical Record和块内保存

AFNetwork 作用和用法详解

Swift 的 AFNetwork [关闭]

很奇怪,包括 AFNetwork 的问题?

如何使用 AFNetwork 的 AFHTTPRequestOperationManager 设置 HTTP 请求正文?

我是不是需要将 Alamofire 请求打包成 AFNetwork 之类的东西?