CoreDataBooks 示例 - 从索引 1 开始单元格?
Posted
技术标签:
【中文标题】CoreDataBooks 示例 - 从索引 1 开始单元格?【英文标题】:CoreDataBooks Example - Start Cells at Index 1? 【发布时间】:2012-01-16 16:48:14 【问题描述】:我正在使用 Apple 的 CoreDataBooks 示例项目,我想在我的 tableview 中的 indexPath 0 处有一个自定义单元格,然后让我的核心数据从索引 1 开始获取结果。
我尝试了一些不同的解决方案,但无法使其正常工作,如果您有任何想法,将不胜感激。
如果您想知道我的尝试和失败,请告诉我。我想要实现的似乎很简单,只需在单元格 1 而不是 0 处开始获取结果。
编辑 2:
我所有的 UITableViewDataSource 和 configureGuestCell 代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.row == 0)
static NSString *CellIdentifier = @"statsCell";
GuestStatsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[GuestStatsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//Configure the cell.
[self configureStatsCell:cell];
return cell;
if (indexPath.row > 0)
static NSString *CellIdentifier = @"guestCell";
customGuestCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[customGuestCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
// Configure the cell.
[self configureGuestCell:cell atIndexPath:indexPath];
return cell;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
int cellHeight;
if (indexPath.row == 0)
cellHeight = 240;
else
cellHeight = 44;
return cellHeight;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [[fetchedResultsController sections] count];
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
- (void)configureGuestCell:(customGuestCell *)cell atIndexPath:(NSIndexPath *)indexPath
//Configure the cell to show the Guests first and last name and other details
GuestInfo *guest = [fetchedResultsController objectAtIndexPath:indexPath];
cell.guestNameLbl.text = [NSString stringWithFormat:@"%@ %@", guest.firstName, guest.lastName];
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
// Delete the managed object.
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
NSError *error;
if (![context save:&error])
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
// Create and push a detail view controller.
guestListDetailViewController *detailViewController = [[guestListDetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
GuestInfo *selectedGuest = (GuestInfo *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
// Pass the selected book to the new view controller.
detailViewController.guest = selectedGuest;
[self.navigationController pushViewController:detailViewController animated:YES];
【问题讨论】:
请贴出所有 UITableViewDataSource 和 configureGuestCell 代码 【参考方案1】:固定代码:
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects] +1;
- (void)configureGuestCell:(customGuestCell *)cell atIndexPath:(NSIndexPath *)indexPath
NSIndexPath *path = [NSIndexPath indexPathForRow:(indexPath.row - 1) inSection:indexPath.section]
//Configure the cell to show the Guests first and last name and other details
GuestInfo *guest = [fetchedResultsController objectAtIndexPath:path];
cell.guestNameLbl.text = [NSString stringWithFormat:@"%@ %@", guest.firstName, guest.lastName];
小解释: 您应该在 numberOfRowsInSection 中再返回一行,但是,为了防止错误,在调用 [NSFetchedResultsController objectAtIndexPath] 之前应该减少行号。
【讨论】:
工作得很好,谢谢。为什么这是连续递减而不是递增?举个例子,您肯定将获取的结果从索引 0 移动到索引 1 等等,而不是相反? 很简单,cellForRowAtIndexPath
中的 indexPath 的范围是 0 到 'numberOfRowsInSection'。我们在 numberOfRowsInSection 中添加了一行,现在范围增加了,但是在 fetchedResultsController 中我们仍然少了一个对象。所以我们必须在第一行之后减少每一行的 indexPath(行号),添加单元格的位置。
一个有趣的事情要注意。我已经按照您的建议完成了,并且在从表中删除获取的结果时,如果它是最后一个,它会删除索引 0 处的自定义单元格。然后在添加记录(如果不存在)后,摘要将重新出现。任何想法为什么?
当然,只要你有'[fetchedResultsController objectAtIndexPath:indexPath]]',你应该像'configureGuestCell'一样替换它。
我一直在进行适当的测试,每次更改我都没有运气。很抱歉要求您提供更多帮助。看来我的自定义单元格(实际上位于索引 0)和第一个核心数据记录(位于索引 1)认为它位于索引 0,这可能导致我的自定义单元格与核心数据记录一起消失以及当我更改任何该特定核心数据记录中的信息会崩溃,期待 statsCell 而不是 guestCell(因为它认为它的索引为 0)。你的解决方案,以正确的方式使用,是我唯一需要的吗?我无法解决上述问题。【参考方案2】:
indexPath.row 值加 1....?!
【讨论】:
检查我的编辑。我试图让核心数据单元仅用于超过 0 且不包括在内的单元。然后单元格 0 是我的自定义单元格。这导致单元格 0 成为我的自定义单元格,但在选择时也会转到第一个核心数据记录。【参考方案3】:为此,您还需要编辑 -tableView: numberOfRowsInSection:
以返回 (realRows + 1)。
同样,每当您引用 NSFetchedResultsController
| 时,您都希望将行递减 1。 NSArray
我怀疑在你的configureCell:atIndexPath:
中
您想要/需要触摸数据源的任何地方,您都需要通过递增或递减来调整该行。
对 OP 的回应
不要更改NSIndexPath
,没有必要。调整您的-configureCell: atIndexPath:
或任何其他触及该索引值的索引:
-(void)configureCell:(id)cell atIndexPath:(NSIndexPath*)indexPath
NSInteger finalIndex = [indexPath row] - 1;
NSIndexPath *newPath = [NSIndexPath indexPathForRow:finalIndex inSection:[indexPath section]];
id object = [[self myNSFRC] objectAtIndexPath:newPath];
//Continue configuring your cell
显然,如果您使用的是数组,则不必费心创建新的NSIndexPath
。
【讨论】:
有道理,我尝试的第一件事是在我的numberOfRowsInSection
方法中使用return [sectionInfo numberOfObjects] + 1;
,但它只是抛出一个超出范围的索引错误并在表加载时使应用程序崩溃。但另一方面,你推荐而不是仅仅通过indexPath
,也许是indexPath + 1
?我该怎么做,显然这完全行不通。以上是关于CoreDataBooks 示例 - 从索引 1 开始单元格?的主要内容,如果未能解决你的问题,请参考以下文章
CoreDataBooks 示例中是不是存在有关日期的错误?
我想用 UIPickerView 扩展 CoreDataBooks 示例
navigationController 如何在此代码中设置它的 topViewController(来自 CoreDataBooks 示例)?