在iOS中,选定的单元格应该移动到UITableView的顶部

时间:2014-01-24 10:10:30

标签: ios objective-c uitableview

我的自定义表格视图中有超过20个单元格,在执行时间内将显示6个单元格。现在我选择第4个单元意味着,第4个单元必须进入第一个位置,第5个单元进入第2个位置,依此类推。怎么做这个过程,我试过这样。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MACalendarCustomCell *cell = (MACalendarCustomCell*) [tableView dequeueReusableCellWithIdentifier:[MACalendarCustomCell reuseIdentifier]];
    if(cell == nil)
    {
        [[NSBundle mainBundle] loadNibNamed:@"MACalendarCustomCell" owner:self options:nil];
        cell = customCell;
        customCell = nil;

    }

        cell.lbl_CalendarTitle.text = [arr_CalendarTitle objectAtIndex:indexPath.row];
        cell.lbl_CalendarSubTitle.text = [arr_CalendarSubTitle objectAtIndex:indexPath.row];
        cell.lbl_calendarEventTime.text = [arr_CalendarEventTime objectAtIndex:indexPath.row];
        cell.lbl_calendarDate.text = [arr_CalendarDate objectAtIndex:indexPath.row];
        cell.lbl_CalendarMonth.text = [arr_CalendarMonth objectAtIndex:indexPath.row];
        cell.lbl_CalendarYear.text = [arr_CalendarYear objectAtIndex:indexPath.row];
        cell.img_BackGround.image = [UIImage imageNamed:@"calendar_Cell_Up.png"];

        //here click event is occurred.
        cell.btn_CollapseExpand.tag = indexPath.row;
        [cell.btn_CollapseExpand addTarget:self action:@selector(method_Expand:) forControlEvents:UIControlEventTouchUpInside];
    return cell;

}

ButtonPressed事件调用

- (void)method_Expand:(UIButton*)sender
{
    UITableViewCell *cell = (UITableViewCell *)sender.superview;
    NSIndexPath *indexpath = [tbl_CalendarList indexPathForCell:cell];

    [tbl_CalendarList moveRowAtIndexPath:[NSIndexPath indexPathForItem:indexpath.row inSection:indexpath.section] toIndexPath:[NSIndexPath indexPathForItem:0 inSection:indexpath.section]];

    int_SelectedIndex = sender.tag;
    NSLog(@"Selected Button : %ld",(long)int_SelectedIndex);
    if ( int_TempSelectedIndex != int_SelectedIndex)
    {
        int_TempSelectedIndex = int_SelectedIndex;
    }
    else
    {
        int_TempSelectedIndex = -1;
    }

    [tbl_CalendarList reloadData];
}

调整单元格大小

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (indexPath.row == int_TempSelectedIndex )
    {
        cellSize = 300;
        isRowSelected[indexPath.row] = YES;
    }
    else
    {
        cellSize = 100;
        isRowSelected[indexPath.row] = NO;
    }

    return cellSize;

}

现在我在模拟器中得到了这个。

enter image description here

当我按下它的时候就是这样。

enter image description here

此选定的单元格应该位于第一位置。

4 个答案:

答案 0 :(得分:4)

您可以将表格视图滚动到该单元格,并且可以指定在选择单元格时将其滚动到顶部:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

希望这就是你所追求的目标。

答案 1 :(得分:1)

正如我在评论中写的那样:

选择后,将selected arr_CalendarTitle条目移至数组顶部,然后在reloadData()上调用tableView。表视图显示按arr_CalendarTitle排序的数据。

moveRowAtIndexPath是不够的,也必须使用数组。

因此,在reloadData()调用之前(在按钮点击方法中),执行以下操作:

id object = [[[arr_CalendarTitle objectAtIndex:int_SelectedIndex] retain] autorelease];
[arr_CalendarTitle removeObjectAtIndex:int_SelectedIndex];
[arr_CalendarTitle insertObject:object atIndex:0];

对于ARC,您可以使用:

__autoreleasing id object = [arr_CalendarTitle objectAtIndex:int_SelectedIndex];
[arr_CalendarTitle removeObjectAtIndex:int_SelectedIndex];
[arr_CalendarTitle insertObject:object atIndex:0];

由于你有多个数据保存数据(现在才注意到),你必须为每个保存tableView单元数据的数组执行此操作。

答案 2 :(得分:1)

在获取所选行后的method_Expand方法中,您必须删除所选索引处的对象,并将删除的对象插入0索引。

您还想将下一个项目移动到第二个位置

为此,您必须递增所选索引并检查该索引是否在数组边界中,然后删除该项并将其添加到索引1;

- (void)method_Expand:(UIButton*)sender

    UITableViewCell *cell = (UITableViewCell *)sender.superview;
    NSIndexPath *indexpath = [tbl_CalendarList indexPathForCell:cell];

    int nextIndex=indexpath.row+1;

    // first remove the object
   NSString *str=[arr_CalendarTitle objectAtIndex];
   [arr_CalendarTitle removeObjectAtIndex:indexpath.row];
   [arr_CalendarTitle insertObject:str atIndex:0];

   //do the same to arr_CalendarEventTime,arr_CalendarDate,arr_CalendarMont etc

  if([arr_CalendarTitle count]-1<nextIndex)// check if nextIndex within bounds to avoid crash
  {
   // remove next object and addit to the index 1 to all array
  }
   [tbl_CalendarList reloadData];
}

答案 3 :(得分:0)

使用以下方法滚动您的桌面视图。

[tableview setContentOffset:CGPointMake(0, button.tag*tableview.rowHeight) animated:YES];

此方法将使tableview滚动到指定的点。 根据您的代码更改CGPointMake中的Y值。