2012-05-11 101 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兩次。

相關問題