cellForRowAtIndex自定义方法

时间:2014-01-22 00:30:36

标签: ios uitableview core-data

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

  1. 来自search bar controller
  2. 的搜索结果
  3. 来自NSFetchedResultsController的折叠部分。
  4. NSFetchedResultsController的扩展部分。
  5. 在第一个选项中没有问题。

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

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

    这里有截图:

    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 个答案:

答案 0 :(得分:1)

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

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

编辑:如何实现映射

您无需在iOS中有经验即可实现它。我不是很有经验,我实施了它。

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

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