2012-05-11 15 views
6

İçinde 4 satır bulunan bir UITableView varsa, o görünüme gittiğimde cellForRowAtIndexPath yönteminin 4 kez çağrılmaması gerekir mi? Birden çok kez çağrıldığını buluyorum, ör. 4 satır varsa, UITable görünümüne indiğimde 8 kez çağrılır ve aynı UITableView'a geri döndüğümde 12 kez denir.UITableView cellForRowAtIndexPath, her satır için birden çok kez çağrıldı

Bu yöntemin nasıl çalıştığını yanlış anlamış mıyım? Görüntülenen her satır için bir kez çağrılması gerektiğini düşündüm (masa ekranının içeriği iPad ekranına kolayca sığdığı sürece kaydırma yoktur).

UITableView öğesinin bir iPad'de bir UISplitViewController ürününün MasterViewController bölümünde yer aldığını unutmayın.

DÜZENLEME:

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

Ben ilk şey olarak çalışmak benim navigasyon yığının belli bir seviyeye "detaya": Ben alıyorum asıl sorun şu kod uygulandığı bu şekilde tutarsızlık olduğunu yapmalılar. Ancak daha sonra geriye veya aşağıya doğru gidersem, çeşitli satırların hatalı şekilde işlendiğini, yani etkinleştirilmeleri gerektiğinde devre dışı bırakıldıklarını fark ettim. Bu bana neler olup bittiğini anlamaya çalışmak için bir mola noktasını ve bazı günlük kodlarını koymamı sağladı. Yukarıdaki kodun satırlar olduğundan daha fazla kez çağrıldığını buldum - ve oturum açtığım cell.textLabel.text değeri mantıklı değil - aynı satır için bir değer birden çok kez günlüğe kaydediliyordu - ve diğer satırlar hiç kayıtsız.

DÜZENLEME: istendiği gibi bazı kod sağlanması:

- (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 her hücre için çağrılır. bazı kodları paylaşabilirsiniz, böylece bir sorunla karşılaşabilirsiniz. thnx –

+0

İstediğim gibi bazı kodları ekledim - doğru yöntemleri seçip seçmediğimi bilmiyorum. – daveywc

+2

Ayrıca "reloadData" işlevini birden çok kez çağırmamaya dikkat edin. – Alladinian

cevap

7

hücre göründüğünde yöntemi denir, bir hücre görünecek şekilde zaman, yöntemi denir. Ayrıca, hücreler yeniden kullanılır. Bu nedenle, belirli bir hücre için yöntem bir kez çağrılsa bile, bu hücre kaybolduğunda başka bir zaman çağrılabilir ve sonra tekrar görünür.

+0

Veya seçildiğinde veya seçimden kaldırıldığında. – Sulthan

+0

@Sulthan, sanmıyorum. Belki başka bir yöntem '- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath ' – yoyosir

+0

Yanlışsınız. Tam olarak ne demek istediğimi biliyorum. Hücrenin seçilmesi veya seçiminin kaldırılması hücre kullanıcı arayüzünü tamamen değiştirebilir, bu yüzden bir satır seçtiğinizde, cellForRow '_four_ times olarak adlandırılabilir. – Sulthan

2

diğer yöntemlerle arıyorsanız o Yüksek olasılıklı - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath dışından

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

self.tableView cellForRowAtIndexPath iki kez arayacak.

İlgili konular