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"];
}
}
}
cellForRowAtIndexPathは、すべてのセルに対して呼び出されます。私たちはURの問題を見ることができるようにいくつかのコードを共有できますか? thnx –
私は要求通りにいくつかのコードを追加しました - 正しい方法を選んだかないかはわかりません。 – daveywc
'reloadData'を何回も呼び出さないようにしてください。 – Alladinian