2012-05-11 4 views
6

4行あるUITableViewを持っている場合、そのビューに移動するとcellForRowAtIndexPathメソッドが4回呼び出されませんか?私はそれが複数回呼び出されていることを発見しています。ある行が4行ある場合、UITableビューにドリルダウンすると8回呼び出され、同じUITableViewに戻ると12回表示されます。UITableView cellForRowAtIndexPathが各行に対して2回以上呼び出されました

この方法の仕組みを誤解していますか?表示されている行ごとに一度呼び出す必要があると考えました(テーブルビューのコンテンツがiPadの画面に簡単に収まるようにスクロールすることはありません)。

私はおそらく、UITableViewはiPad上のUISplitViewControllerのMasterViewControllerに含まれていることに注意してください。

EDIT:

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の値が意味をなさない - 同じ行の値が複数回記録されていました - そして他の行はまったく記録されている。

EDIT:要求に応じていくつかのコードを提供する:

- (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は、すべてのセルに対して呼び出されます。私たちはURの問題を見ることができるようにいくつかのコードを共有できますか? thnx –

+0

私は要求通りにいくつかのコードを追加しました - 正しい方法を選んだかないかはわかりません。 – daveywc

+2

'reloadData'を何回も呼び出さないようにしてください。 – Alladinian

答えて

7

セルが表示されたときにメソッドが呼び出されるので、セルが表示されたときはいつでも、メソッドが呼び出されます。また、細胞は再利用される。したがって、特定のセルのメソッドが一度呼び出されたとしても、このセルが消えて再び表示される別の時間に呼び出されることがあります。

+0

または選択されているか選択解除されているとき。 – Sulthan

+0

@スルタン、そうは思わない。多分あなたは別の方法を意味する - (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を2回呼び出します。

関連する問題