0

UITableView当按下按钮时,我有一个in next segue。我在实现文件中实现的代码如下。视图正在移动,但数据未加载到视图中。

可能是什么问题呢?

- (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;
}
4

3 回答 3

1
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 0;
}

你不需要至少1个部分吗?

于 2012-08-15T11:28:30.553 回答
0

您应该在调试器中使用断点来中断numberOfRowsInSection方法并cellForRowAtIndexPath验证您的数据是否被正确解析和处理。如果您不熟悉断点,现在是了解它们的好机会——它们在调试和解决问题方面非常宝贵。

作为一般说明,您可能不应该使用它dataWithContentsOfURL来建立网络。它并不是真正为这种用途而设计的。NSURLConnection是一个更好的选择,它将为您提供更大的灵活性。

于 2012-08-15T11:27:59.383 回答
0
dyspatch_async

之所以命名为是因为它是异步的。您似乎认为第二次调用它是在第一次调用之后执行的 - 但不是。它们是并行执行的,并且由于 URL 操作较慢,表视图的更新会在还没有数据时发生。

解决方案:将 reloadData 调用与 URL 操作放在同一个块中 - 您不需要两个单独的 dispatch_async 调用。

此外,您返回 0 从

numberOfSectionsInTableView:

所以该表甚至不查找数据。返回 1。

于 2012-08-15T11:34:31.107 回答