簡體   English   中英

AFNetworking 2.0解析的數據未顯示在表格視圖中

[英]AFNetworking 2.0 parsed data not displaying in table view

我的問題:表格中沒有數據。

以下是用於檢索json對象數組並使用AFNetworking 2.0對其進行解析的代碼。 我有一個UIViewController,在其中放置了帶有原型單元的表格視圖,原型單元具有重用標識符EventCell。 我想要的是在每個單元格中顯示標題和圖像。 我在運行時沒有錯誤。

的NSDictionary + events.h

#import <Foundation/Foundation.h>

@interface NSDictionary (events)

- (NSString *)eventImage;
- (NSString *)eventTitle;
- (NSDate *)eventDate;
- (NSNumber *)eventPrice;
- (NSNumber *)eventTicketsTotal;
@end

的NSDictionary + events.m

#import "NSDictionary+events.h"

@implementation NSDictionary (events)



- (NSString *)eventImage
{
    return self[@"event_image"];

}

- (NSString *)eventTitle
{
    return self[@"event_title"];

}

- (NSDate *)eventDate
{
    //    NSString *dateStr = self[@"date"]; // date = "2013-01-15";
    return [NSDate date];
}

- (NSNumber *)eventPrice
{
    NSString *cc = self[@"event_price"];
    NSNumber *n = @([cc intValue]);
    return n;
}

- (NSNumber *)eventTicketsTotal{
    NSString *cc = self[@"event_tickets_total"];
    NSNumber *n = @([cc intValue]);
    return n;
}

@end

的NSDictionary + events_package.h

#import <Foundation/Foundation.h>

@interface NSDictionary (NSDictionary_events_package)

-(NSArray *)upcomingWeather;
@end

的NSDictionary + events_package.m

#import "NSDictionary+events_package.h"

@implementation NSDictionary (NSDictionary_events_package)


- (NSArray *)upcomingWeather
{
    NSDictionary *dict = self[@"data"];
    return dict[@"events"];
}
@end

TDViewController.h

#import <UIKit/UIKit.h>
#import "NSDictionary+events.h"

@interface TDViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property(nonatomic, retain) UITableView *tableView;
@end

TDViewController.m

#import "TDViewController.h"

#import "UIImageView+AFNetworking.h"
#import "TDSecondViewController.h"
#import "NSDictionary+events_package.h"

static NSString * const BaseURLString = @"http://xx.zzz.yy.xx/test/";

@interface TDViewController ()

@property(strong) NSDictionary *events;

@end

@implementation TDViewController   

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 1
    NSString *string = [NSString stringWithFormat:@"%@event_json.php?format=json", BaseURLString];
    NSLog(@"web service address: %@", string);

    NSURL *url = [NSURL URLWithString:string];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 2
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        // 3
        self.events = (NSDictionary *)responseObject;
        NSLog(@"%@", responseObject);
        self.title = @"JSON Retrieved";

        [self.tableView reloadData];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

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

    // 5
    [operation start];

}


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

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

        NSDictionary *w;
        if (indexPath.section == 0) {
            {
                w = [self.events upcomingWeather][indexPath.row];
                //NSLog( @"this is w: %@", w );
            }
            wac.weatherDictionary = w;

        }
    }
}


#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(!self.events)
        return 0;

    NSArray *upcomingWeather = [self.events upcomingWeather];
    return [upcomingWeather count];
    NSLog( @"the count is %lu", (long)[upcomingWeather count]);
}

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

    NSDictionary *daysWeather = nil;


    NSArray *upcomingWeather = [self.events upcomingWeather];
    daysWeather = upcomingWeather[indexPath.row];
    NSLog( @"this is daysWeather: %@", daysWeather );
    cell.textLabel.text = [daysWeather eventTitle];
     NSLog(@"The content of arry is%@",daysWeather);

    NSURL *url = [NSURL URLWithString:daysWeather.eventImage];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    UIImage *placeholderImage = [UIImage imageNamed:@"placeholder"];

    __weak UITableViewCell *weakCell = cell;

    [cell.imageView setImageWithURLRequest:request
                          placeholderImage:placeholderImage
                                   success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                                       weakCell.imageView.image = image;
                                       [weakCell setNeedsLayout];

                                   } failure:nil];    
    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
}

@end

以下是我在模擬器上運行項目時獲得的nslog輸出(請注意,並非所有nslog語句都在顯示)。

2014-04-06 21:47:04.592 iCLUB[9198:60b] webservice address:     
http://xx.zzz.yy.xx/test/event_json.php?format=json
2014-04-06 21:47:04.685 iCLUB[9198:60b] {
data =     {
    events =         (
                    {
            "event_date" = "7-5-2014";
            "event_id" = 22;
            "event_image" = "http://xx.zzz.yy.xx/...";
            "event_price" = 150;
            "event_tickets_total" = 200;
            "event_title" = "New Event Title";
        },
                    {
            "event_date" = "3-2-2014";
            "event_id" = 23;
            "event_image" = "http://xx.zzz.yy.xx/...";
            "event_price" = 150;
            "event_tickets_total" = 200;
            "event_title" = "New Event Title 2";
        },
                    {
            "event_date" = "9-25-2014";
            "event_id" = 24;
            "event_image" = "http://xx.zzz.yy.xx/...";
            "event_price" = 150;
            "event_tickets_total" = 200;
            "event_title" = "New Event Title 33";
        }
    );
};
}

我只是不明白問題是什么,該應用程序在模擬器上構建並運行,但是單元格看上去完全是空的。 我將不勝感激任何幫助。 謝謝,JT。

該問題的可能原因包括:

  • 未能為表視圖連接IBOutlet 如果未正確連接tableView屬性,則它將為nil ,因此[self.tableView reloadData]將不執行任何操作(因為向nil對象發送消息不會執行任何操作)。

    坦率地說,我不清楚如何設置此tableView屬性,因為它缺乏在Interface Builder中連接控件時使用的典型IBOutlet限定,而且我也看不到您以編程方式進行設置。

  • 無法將視圖控制器指定為delegate ,更重要的是,未指定表視圖的dataSource 如果是這種情況,即使您成功調用了[self.tableView reloadData] ,也不會導致調用UITableViewDataSource方法。

我建議檢查一下self.tableViewself.tableView.dataSource是否為nil

  1. 不會調用numberOfRowsInSection中的此NSLog語句,因為該方法在該語句之前返回!

      return [upcomingWeather count]; NSLog( @"the count is %lu", (long)[upcomingWeather count]); 
  2. 似乎沒有調用cellForRowAtIndexPath,這可能是由於多種原因造成的,包括未設置UITableView數據源和委托,numberOfRowsInSection返回0或TableView為零。 使用調試器將使您看到正在發生哪種情況。

    查看蘋果的調試資源

當解析json數據時,請使用上面的代碼

NSDictionary *dict = (NSDictionary *)responseObject;
    self.events = [dict objectForKey:@"data"];

您還記得為self.tableView設置委托和數據源嗎? 當您不繼承UITableViewController的子類時,它不會自動為您完成。

我認為您從API獲取的JSON無效。 events數組應括在方括號[]而不是括號中。 此外,JSON不使用分號。 請參閱JSON 規范

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM