在我的tableViewController
中,有一种cellForRowAtIndex
方法,它有三种可能的来源。
search bar controller
。NSFetchedResultsController
的折叠部分。NSFetchedResultsController
的扩展部分。在第一个选项中没有问题。
在第二个选项中,该方法创建一个新的Top Row,以宣布该部分是可扩展的。这个选项没有问题。
在第三个选项中,所选部分会扩展其行,但问题是第一行不是预期行,而是前一个选项中的新顶行。
这里有截图:
这就是方法代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
ToDoItem *toDoItem = nil;
//SEARCH RESULTS
if (tableView == self.searchDisplayController.searchResultsTableView)
{
if (cell==nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
}
NSLog(@"Configuring cell to show search results");
toDoItem = [self.searchResults objectAtIndex:indexPath.row];
cell.textLabel.text = toDoItem.todoName;
NSDate *fechaToDO = toDoItem.todoDueDate;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"EEEE, dd MMMM YYYY"];
NSString *fechaToDo = [dateFormatter stringFromDate:fechaToDO];
NSString *valorSomeDay = toDoItem.isSomeDay;
if ([valorSomeDay isEqualToString:@"issomeday"]){
cell.detailTextLabel.text = @"Someday";
}
else {
cell.detailTextLabel.text = fechaToDo;
}
}
//COLLAPSABLE/EXPANDABLE
else
{
if ([self tableView:tableView canCollapseSection:indexPath.section])
{
if (!indexPath.row)
{
// first row
cell.textLabel.text = @"Expandable"; // only top row showing
if ([expandedSections containsIndex:indexPath.section])
{
cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor grayColor] type:DTCustomColoredAccessoryTypeUp];
}
else
{
cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor grayColor] type:DTCustomColoredAccessoryTypeDown];
}
}
else
//FETCHED RESULTS
{
cell.accessoryView = nil;
ToDoItem *todoitem = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = todoitem.todoName;
NSDate *fechaToDO = todoitem.todoDueDate;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"EEEE, dd MMMM YYYY"];
NSString *fechaToDo = [dateFormatter stringFromDate:fechaToDO];
NSString *valorSomeDay = todoitem.isSomeDay;
if ([valorSomeDay isEqualToString:@"issomeday"]){
cell.detailTextLabel.text = @"Someday";
}
else {
cell.detailTextLabel.text = fechaToDo;
}
}
}
}
return cell;
}
欢迎任何帮助,以便在扩展部分时能够显示第一个核心数据对象而不是发明的顶行。 它还要求我提出另一个解决方案,可以避免在部分折叠时使用本发明的顶行。 谢谢。
答案 0 :(得分:1)
在插入扩展产生的行后,您需要保留原始索引路径和新索引路径的映射。
如果您正确实现它,您应该能够从旧的索引路径获取新的索引路径。例如:在第1行展开并添加了2个子行后,第3项现在为5。
编辑:如何实现映射
您无需在iOS中有经验即可实现它。我不是很有经验,我实施了它。
示例:
0 => 0
1 => 1
2 => 2
3 => 3
4 => 4
5 => 5
6 => 6
变为
0 => 0
1 => 1
2 => 2
3 => 3
4 => 3.0
5 => 3.1
6 => 3.2
7 => 4
8 => 5
9 => 6
展开第3行时