gpt4 book ai didi

ios - cellForRowAtIndex 自定义方法

转载 作者:行者123 更新时间:2023-11-29 03:19:33 25 4
gpt4 key购买 nike

在我的 tableViewController 中,有一个 cellForRowAtIndex 方法,它具有三个可能的来源。

  1. 来自搜索栏 Controller 的搜索结果。
  2. 来自 NSFetchedResultsController 的折叠部分。
  3. 来自 NSFetchedResultsController 的扩展部分。

第一个选项没有问题。

在第二个选项中,该方法创建一个新的顶行以宣布该部分是可扩展的。此选项没有问题。

在第三个选项中,所选部分扩展了它的行,但问题是第一行不是预期的行,而是前一个选项的新顶行。

这里有两个截图:

enter image description here enter image description here

这是方法代码:

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

欢迎提供任何帮助,以便在扩展各部分时能够显示第一个核心数据对象,而不是发明的顶行。还请求向我提出另一种解决方案,该解决方案可以避免在折叠部分时使用本发明的顶行。谢谢。

最佳答案

插入扩展产生的行后,您需要保留原始索引路径和新索引路径的映射。

如果正确实现,您应该能够从旧索引路径获取新索引路径。例如:第 1 行展开并添加 2 个子行后,第 3 项现在为 5。

编辑:如何实现映射

您不需要具备 iOS 经验即可实现它。我经验不多,但我实现了它。

  1. 创建一个数组,其键将是 TableView 看到的索引路径(即,如果总共有 10 行,则为 0 到 9),值是索引路径(或者您真正想要的任何内容),即告诉您正在引用数据源中的哪一行(即 0、1、2、3、3.0、3.1、3.2、4、5、6,如果第 3 行当前有 3 个子行展开)。
  2. 每当您展开(添加)行时,请将它们插入到字典中的正确位置:在此示​​例中,当您展开第 3 行时,将所有 3 行插入到索引 4、5、6 处。
  3. 每当您折叠(删除)行时,请将它们从该数组中删除。

示例:

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 行时

关于ios - cellForRowAtIndex 自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21271926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com