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"];
}
}
}
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 –
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
Hãy chắc chắn rằng bạn không gọi 'reloadData' nhiều lần. – Alladinian