2012-05-11 102 views
6

如果我有一个UITableView有4行,那么当我导航到该视图时,不应该调用cellForRowAtIndexPath方法4次?我发现它被多次调用,例如如果有4行,当我向下钻入UITable视图时调用8次,而当我导航回到同一个UITableView时则调用12次。UITableView cellForRowAtIndexPath为每行调用多次

我只是误解这种方法是如何工作的?我认为应该为显示的每一行调用一次(因为表视图的内容很容易适合我的iPad屏幕,所以不涉及滚动)。

我应该注意到UITableView包含在iPad的UISplitViewController的MasterViewController中。

编辑:我得到真正的问题是在这样的不一致正在应用下面的代码:

if (selectedNavItem.folder.isAssignedToUser != [NSNumber numberWithInt:1]) 
     { 
      NSLog(@"%@", cell.textLabel.text); 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
      cell.userInteractionEnabled = NO; 
      cell.textLabel.enabled = NO; 
      cell.detailTextLabel.text = @"Access not granted"; 
      cell.detailTextLabel.enabled = NO; 
     } 

当我第一次“深入”到我的导航堆栈的特定级别工作的事情作为他们应该。但后来,如果我向上或向下导航,那么我发现各行得到不正确的处理,即它们应该被启用时最终禁用。这导致我放置了一个中断点和一些日志代码来试图找出正在发生的事情。我发现上面的代码被调用的次数比行数多 - 我记录的cell.textLabel.text值没有意义 - 同一行的值被多次记录 - 其他行不是正在被记录。

编辑:提供一些代码的要求:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 


- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (__fetchedResultsController != nil) { 
     return __fetchedResultsController; 
    } 

    // Set up the fetched results controller. 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"NavItem" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Edit the sort keys as appropriate. 
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES]; 
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self. 
     managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     */ 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return __fetchedResultsController; 
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    NavItem *selectedNavItem = (NavItem *)managedObject; 
    cell.textLabel.text = [[managedObject valueForKey:@"name"] description]; 
    cell.detailTextLabel.text = @""; 

    if (selectedNavItem.folder != nil) { 
     cell.imageView.image = [UIImage imageNamed:@"Folder.png"]; 


     //NSLog(@"%@", selectedNavItem.folder.isAssignedToUser); 

     if (selectedNavItem.folder.isAssignedToUser != [NSNumber numberWithInt:1]) 
     { 
      NSLog(@"%@", cell.textLabel.text); 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
      cell.userInteractionEnabled = NO; 
      cell.textLabel.enabled = NO; 
      cell.detailTextLabel.text = @"Access not granted"; 
      cell.detailTextLabel.enabled = NO; 
     } 
    } 
    else if (selectedNavItem.document != nil) { 
     cell.detailTextLabel.text = [[selectedNavItem.document valueForKey:@"itemDescription"] description]; 

     if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"pdf"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"pdf.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"doc"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"docx"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"Word-32x32.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"xls"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"xlsx"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"Excel-32x32.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"ppt"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"pps"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"Powerpoint-32x32.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"mp3"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"wav"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"65-note.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"mp4"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"mov"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"46-movie-2.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"ibooks"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"ibooks-icon.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"png"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"bmp"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"jpg"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"jpeg"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"tif"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"tiff"] || [[selectedNavItem.document.fileName pathExtension] isEqualToString:@"gif"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"41-picture-frame.png"]; 
     } 
     else 
     { 
      cell.imageView.image = [UIImage imageNamed:@"179-notepad.png"]; 
     } 


    } 
    else if (selectedNavItem.attachment != nil) { 
     cell.detailTextLabel.text = [[selectedNavItem.attachment valueForKey:@"itemDescription"] description]; 

     if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"pdf"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"pdf.png"]; 
     } 
     else if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"doc"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"docx"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"Word-32x32.png"]; 
     } 
     else if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"xls"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"xlsx"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"Excel-32x32.png"]; 
     } 
     else if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"ppt"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"pps"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"Powerpoint-32x32.png"]; 
     } 
     else if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"mp3"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"65-note.png"]; 
     } 
     else if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"mp4"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"46-movie-2.png"]; 
     } 
     else if ([[selectedNavItem.document.fileName pathExtension] isEqualToString:@"ibooks"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"ibooks-icon.png"]; 
     } 
     else if ([[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"png"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"bmp"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"jpg"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"jpeg"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"tif"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"tiff"] || [[selectedNavItem.attachment.fileName pathExtension] isEqualToString:@"gif"]) 
     { 
      cell.imageView.image = [UIImage imageNamed:@"41-picture-frame.png"]; 
     } 
     else 
     { 
      cell.imageView.image = [UIImage imageNamed:@"179-notepad.png"]; 
     } 
    } 

} 
+2

cellForRowAtIndexPath为每个单元格调用。你可以分享一些代码,以便我们看看你的问题。 thnx –

+0

我已经按要求添加了一些代码 - 不知道我是否选择了正确的方法。 – daveywc

+2

确保您不会多次调用'reloadData'。 – Alladinian

回答

7

细胞出现时的方法被调用,所以每当一个细胞出现时,该方法被调用。此外,这些单元格被重新使用。所以即使某个特定单元格的方法被调用一次,也可能需要另外一次该单元格消失并再次出现。

+0

或何时被选中或取消选择。 – Sulthan

+0

@Sulthan,我想不是。也许你的意思是另一种方法' - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath ' – yoyosir

+0

你错了。我确切地知道我的意思。选择或取消选择单元格可以完全改变单元格的UI,这就是为什么'cellForRow'在选择一行时可以被调用_four_次。 – Sulthan

2

很有可能你是从其他方法调用:从- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

self.tableView将调用的cellForRowAtIndexPath两次。

相关问题