UITableViewCell不显示已加载的数据,但在选中时显示它

时间:2014-02-20 11:45:11

标签: ios objective-c uitableview

我面临一个奇怪的问题,我确信我做错了什么。在我的UITableViewController类中,我有一个函数如下:

-(void)EERefreshView
{
    NSLog(@"App delegate requested the view be refreshed");
    [self loadEventsFromDB];

    for(int a=0;a<eventsList.count;a++)
    {

        DB_EEEvent *event = (DB_EEEvent*)eventsList[a];
        UITableViewCell *cell =
        [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];
        //NSLog(@"CellID %@", cell.reuseIdentifier);


        //get references to the UI components
        UILabel *lblTitle = (UILabel*)[cell.contentView viewWithTag:5];
        UILabel *lblDate = (UILabel*) [cell.contentView viewWithTag:6];
        UIImageView *imgEvent = (UIImageView*)[cell.contentView viewWithTag:7];

        //set values
        lblTitle.text = event.name;

        lblDate.text = [NSString stringWithFormat:@"%@ - %@",
                        event.startdate,event.enddate];

        AppDelegate *del = [AppDelegate sharedAppDelegate]; //need this to get the BaseURL

        // Here we use the new provided setImageWithURL: method to load the web image
        NSString * imageURL =[[NSString alloc] initWithFormat:@"http://%@%@",del.api.BaseURL,event.logo];
        NSString* webStringURL = [imageURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSURL *url = [NSURL URLWithString:webStringURL];

        [imgEvent setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
            //do somethign when image call completes
        }];

        [eventsListCells addObject:cell];

        if(a == selectedEvent)
        {


        }
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        [tblEventsList reloadData];
    });

}

此函数使用UITableViewCell对象加载数组,然后由

使用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Configure the cell data
    NSLog(@"IndexPathRow: %d", indexPath.row);
    UITableViewCell *cell =  (UITableViewCell*)eventsListCells[indexPath.row];
    return cell;


}

但是当单元格被加载时,lblTitle和lblDate中没有显示文本。但是,当我点击一个单元格时,它会在标签中显示文本。所以这意味着数据存在,但最初创建时不会刷新。我怀疑这可能与线程有关,但我不是这方面的专家,并且会感谢我能得到的任何帮助。

2 个答案:

答案 0 :(得分:1)

我看到有什么困扰你以及为什么你创建了这个方法,但你不需要它。你需要反向线程的唯一原因是你的图像加载,所以应该抛出bkg。线程和其余代码应该在 -

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

你真的不需要预先创建单元格,而且因为它们可以重复使用。例如,如果在eventsList中有50个元素,屏幕上只有5个单元格的空间,则无法创建50个单元格,因为代码将仅创建5 + 1并在屏幕上显示时重复使用它们,因此eventsList的每个元素都将使用这5个单元中的一个,另一侧每个单元将是来自eventsList数组的10个不同元素的主机。所以你可以看到你的代码没有多大意义......

答案 1 :(得分:0)

您在问题中提到的第二个函数是调用用数据填充表的函数。当您拨打[tblEventsList reloadData];时,您的应用只需拨打(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法。所以这个方法需要将数据输出回表。下面是一个非常简单的例子。另外,请确保已设置表委托和数据源。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView 
      dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]
           initWithStyle:UITableViewCellStyleDefault
           reuseIdentifier:CellIdentifier];
    }

    // Configure the cell.
    cell.textLabel.text = [self.your_data_source objectAtIndex:[indexPath row]];
    return cell;
}