在connectionDidFinishLoading完成后无法重新加载UITableView

时间:2012-01-27 21:59:25

标签: ios uitableview xcode4.2

我正在下载并解析JSON对象以构建一个“新闻源”来填充UITableView。我在connectionDidFinishLoading委托方法中的最后一行代码是:

[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

但是,我的断点 - (UITableViewCell *)tableView:(UITableView *)mytableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法未被命中。 (当应用程序首次启动时会被点击)

所以无论出于什么原因,即使我在主线程上调用reloadData;它似乎没有被解雇。我只尝试了[tableView reloadData],但是没有用。

这是我的connectionDidFinishLoading方法:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{       

    //NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    NSArray *publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil]; 

    NSUInteger newsStreamCount = [publicTimeline count];

    // Initialize the collection and the dictionary
    newsItemManager.newsItemCollection = [[NSMutableArray alloc] initWithCapacity:newsStreamCount];
    NSMutableArray *dictOfNewsItems = [[NSMutableArray alloc] initWithCapacity:newsStreamCount];

    // From the JSON object, parse out the individual news item JSON objects and 
    // put them into a dictionary.
    for (int i = 0; i < newsStreamCount; i++)
    {
        NSDictionary *item = [publicTimeline objectAtIndex:i];
        [dictOfNewsItems addObject:item];
    }

    // For each news item JSON object, extract out the information we need for our
    // news manager class
    for (int i = 0; i < newsStreamCount; i++)
    {
        NSString *userName = [[dictOfNewsItems objectAtIndex:i] valueForKey:@"Title"];
        NSString *message = [[dictOfNewsItems objectAtIndex:i] valueForKey:@"Content"];
        NSString *imgUrl = [[dictOfNewsItems objectAtIndex:i] valueForKey:@"https://si0.twimg.com/logo_normal.jpg"];


        NewsItem *newsItem = [[NewsItem alloc] initWithBasicInfo:userName :message :imgUrl];


        [newsItemManager.newsItemCollection addObject:newsItem];
    }

    [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}

这是我的头文件:

#import <UIKit/UIKit.h>

@interface NewsViewController : UITableViewController

@property (nonatomic, retain) NSMutableArray* newsItemArray;
@property (nonatomic, retain) NSMutableData *responseData;
@property (nonatomic, retain) IBOutlet UITableView *tableView;

@end

这是我的实施:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 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;

    self.title = @"News";

    //self.newsItemArray = [[NSMutableArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];

    tableView.rowHeight = 75.0;


    responseData = [NSMutableData data];        
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://blah.com/api/news"]];
    (void)[[NSURLConnection alloc] initWithRequest:request delegate:self];

}

谢谢, 跳蚤

2 个答案:

答案 0 :(得分:2)

如果你的connectionDidFinish ...方法在你的tableViewController类中,也许你只需要

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

答案 1 :(得分:1)

整体问题是我的newsItemManager.newsItemCollection未正确初始化并且整个时间都返回null,因此当UITableView尝试加载数据时;没有什么可以加载的。

我以为我已经检查了这个问题,但其中一个问题是整天盯着电脑而错过了明显的问题。