按下按钮时,我在下一个segue中有一个UITableView
。我在实现文件中实现的代码如下。视图正在移动,但数据未在视图中加载。
可能是什么问题?
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* data = [NSData dataWithContentsOfURL:
[NSURL URLWithString: @"https://api.twitter.com/1/statuses/public_timeline.json"]];
NSError* error;
tweets = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
// 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)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 0;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return tweets.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"TweetCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];
NSString *text = [tweet objectForKey:@"text"];
NSString *name = [[tweet objectForKey:@"user"] objectForKey:@"name"];
cell.textLabel.text = text;
cell.detailTextLabel.text = [NSString stringWithFormat:@"by %@", name];
return cell;
}
答案 0 :(得分:1)
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 0;
}
您不需要至少1个部分吗?
答案 1 :(得分:0)
您应该在调试器中使用断点来中断numberOfRowsInSection
方法和cellForRowAtIndexPath
以验证您的数据是否正在被正确解析和处理。如果你不熟悉断点现在是一个了解它们的好机会 - 它们在调试和解决问题方面是非常宝贵的。
总的来说,您可能不应该使用dataWithContentsOfURL
来建立网络。它并不是真的为这种用途而设计的。 NSURLConnection
是一个更好的选择,它将为您提供更大的灵活性。
答案 2 :(得分:0)
dyspatch_async
被命名为因为它是异步的。你似乎在想第二次调用它是在第一次调用之后执行的 - 但是没有。它们是并行执行的,并且因为URL操作较慢,所以当没有数据时会发生表视图的更新。
解决方案:将reloadData调用放在与URL操作相同的块中 - 您不需要对dispatch_async进行两次单独调用。
此外,您从
返回0numberOfSectionsInTableView:
因此该表甚至不查找数据。返回1.