2014-02-20 69 views
1

我面临一个奇怪的问题,我相信我做错了什么。在我的UITableViewController I类有一个函数,如下所示:UITableViewCell不显示加载数据,但在选中时显示它

-(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对象的数组,然后将其然而,当单元被装载lblTitle和lblDate有用于稍后由

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


} 

没有文字显示在其中。但是当我点击一个单元格时,它会在标签中显示文本。所以这意味着数据在那里,但最初创建时不会刷新。我怀疑这可能与线程有关,但我不是这方面的专家,并希望得到任何帮助。

+1

为什么调用'[[tblEventsList reloadData];'在调度异步? – HRM

+0

@HRM因为TableView UI在主线程中更新。如果我不使用它,那么表格视图将不会自动更新,并保持空白,直到我滚动它。顺便说一句,我尝试调用[tblEventList reloadData]没有异步块,甚至滚动后,文本不加载,除非我点击单元格。这似乎与点击 –

+0

尝试使用具有不同标识符的'dequeueReusableCellWithIdentifier'有关。例如'[self.tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@“Cell_%i”,a]];' –

回答

1

我看到有什么困扰你,为什么你创建了这个方法,但你并不需要它。为什么你需要后线程的唯一原因是你的图片加载,所以应该扔在bkg中。线程和代码的其余部分应该是 -

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

ü真的不需要预先创建的细胞,和U不能引起他们是可重复使用的。例如,如果在eventsList中有50个元素,并且屏幕上只有5个单元格的空间,则不能创建50个单元格,因此代码将只创建5 + 1并在屏幕上显示时重用它们,因此eventsList的每个元素都将使用这5个单元中的一个,而另一侧的每个单元将成为您的eventsList数组中10个不同元素的主机。所以你可以看到你的代码没有什么意义......

+0

@AntonioDev谢谢,这是有道理的,但为什么它会显示数据,当我点击它? –

+1

我真的不知道,但是你的问题在大多数UITableViews中是微不足道的,“已经完成”了,所以我真的没有看到调试你的代码,阅读文档,谷歌它,我相信你会发现很多功能性的例子...尝试IconDownloader类(你在GitHub上),研究这个例子,就是这样。您将多次重复使用此代码... – AntonijoDev

+0

同意。感谢您对此事的洞察。 –

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; 
} 
+0

谢谢@凯尔。我意识到reloadData实际上调用cellForRowAtIndex。我面临的问题是我已经创建了一组我想要使用的单元格。当我在cellForRoWAtIndex函数中返回其中一个单元格形成该数组时,它不会从中加载文本。 –

+1

-1:他对这个方法*的实现是*将单元格放回表格,它们刚刚在其他地方创建。 –

+0

这似乎很奇怪,作为一个快速调试技巧,在cellForRowAtIndexPath方法中打印出您的数组。确保它被分配并且不为空。可能会出现一些奇怪的问题,其中数组在加载时为空,但当用户不执行某些操作时会被设置。 – Kyle

相关问题