2012-05-11 1 views
6

Nếu tôi có UITableView có 4 hàng trong đó thì phương thức cellForRowAtIndexPath không được gọi là 4 lần khi tôi điều hướng đến chế độ xem đó? Tôi thấy rằng nó đang được gọi nhiều lần, v.d. nếu có 4 hàng nó được gọi là 8 lần khi tôi đi sâu vào khung nhìn UITable và sau đó 12 lần khi tôi điều hướng trở lại cùng một UITableView.UITableView cellForRowAtIndexPath được gọi nhiều lần cho mỗi hàng

Tôi chỉ hiểu lầm cách thức hoạt động của phương pháp này? Tôi nghĩ rằng nó nên được gọi một lần cho mỗi hàng được hiển thị (không có di chuyển liên quan như nội dung của bảng xem dễ dàng phù hợp trên màn hình iPad của tôi).

Tôi có lẽ nên lưu ý rằng UITableView được chứa trong MasterViewController của UISplitViewController trên iPad.

EDIT: Vấn đề thực sự tôi nhận được là sự mâu thuẫn trong cách mà đoạn mã sau đang được áp dụng:

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

Khi tôi lần đầu tiên "đi sâu" đến một mức độ cụ hàng hải chồng tôi mọi thứ làm việc như họ nên. Nhưng sau đó nếu tôi điều hướng trở lại lên hoặc xuống thì tôi thấy rằng các hàng khác nhau được xử lý không chính xác, tức là chúng bị vô hiệu hóa khi chúng được kích hoạt. Điều đó dẫn tôi đến một điểm phá vỡ và một số mã đăng nhập để cố gắng tìm hiểu những gì đang xảy ra. Tôi thấy rằng mã ở trên được gọi nhiều lần hơn có hàng - và giá trị cell.textLabel.text mà tôi đã ghi lại không có ý nghĩa - giá trị cho cùng một hàng đã được ghi lại nhiều lần - và các hàng khác không đang đăng nhập.

EDIT: Cung cấp một số mã như yêu cầu:

- (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 được gọi cho mọi ô. u có thể chia sẻ một số mã để chúng tôi có thể hv xem xét vấn đề ur. thnx –

+0

Tôi đã thêm một số mã theo yêu cầu - không chắc chắn tôi đã chọn đúng phương pháp hay chưa. – daveywc

+2

Hãy chắc chắn rằng bạn không gọi 'reloadData' nhiều lần. – Alladinian

Trả lời

7

Phương pháp này được gọi khi các tế bào xuất hiện, vì vậy bất cứ khi nào một tế bào xuất hiện, phương pháp này được gọi. Ngoài ra, các tế bào được tái sử dụng. Vì vậy, ngay cả khi phương pháp cho một ô cụ thể được gọi một lần, nó có thể được gọi cho một thời gian khi tế bào này biến mất và sau đó xuất hiện trở lại.

+0

Hoặc khi được chọn hoặc bỏ chọn. – Sulthan

+0

@Sulthan, tôi nghĩ là không. Có lẽ bạn có nghĩa là một phương pháp '- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath ' – yoyosir

+0

Bạn đang sai. Tôi biết chính xác những gì tôi có ý nghĩa. Việc chọn hoặc bỏ chọn ô có thể thay đổi hoàn toàn giao diện người dùng, đó là lý do tại sao 'cellForRow' có thể được gọi là _four_ lần khi bạn chọn một hàng. – Sulthan

2

cao có thể xảy ra mà bạn đang gọi từ các phương pháp khác:

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

self.tableView từ bên ngoài - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath sẽ gọi cellForRowAtIndexPath hai lần.