获取重新排序的UITableViewCells的顺序

时间:2013-07-11 12:12:35

标签: ios objective-c uitableview

我正在尝试将重新排序的单元格索引放入数组中。

viewDidLoad

cell.showsReorderControl = YES;
arrayTag = [NSMutableArray array];

//在创建单元格时将indexPath.row保存为cell.tag。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {
   .....

   cell.tag = indexPath.row;
   NSString *strCellTag = [NSString stringWithFormat:@"%d",cell.tag];
   if(![arrayTag containsObject:strCellTag])
   {
      [arrayTag addObject:strCellTag];
   }
   return cell;
 }

//我不确定这是不是正确的方法,但下面我试图将更改保存到数组中。

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    [arrayTag replaceObjectAtIndex:sourceIndexPath.row withObject:[NSString stringWithFormat:@"%i",proposedDestinationIndexPath.row]];
    [arrayTag replaceObjectAtIndex:proposedDestinationIndexPath.row withObject:[NSString stringWithFormat:@"%i",sourceIndexPath.row]];

    return proposedDestinationIndexPath;
}

验证我NSLog

- (IBAction)doneButton:(id)sender
{
    NSLog (@"Number of Objects in Array %i", arrayTag.count);

    for (NSString *obj in arrayTag){
        NSLog(@"From ArrayTag obj: %@", obj);
    }   
}

NSLog没有按预期移动单元格。

2013-07-10 17:50:47.291 MyApp[1634:c07] Number of Objects in Array 7
2013-07-10 17:50:47.292 MyApp[1634:c07] From ArrayTag obj: 0
2013-07-10 17:50:47.292 MyApp[1634:c07] From ArrayTag obj: 1
2013-07-10 17:50:47.292 MyApp[1634:c07] From ArrayTag obj: 2
2013-07-10 17:50:47.292 MyApp[1634:c07] From ArrayTag obj: 3
2013-07-10 17:50:47.293 MyApp[1634:c07] From ArrayTag obj: 4
2013-07-10 17:50:47.293 MyApp[1634:c07] From ArrayTag obj: 5
2013-07-10 17:50:47.293 MyApp[1634:c07] From ArrayTag obj: 6

NSLog移动/洗牌后细胞出现错误。我没有得到独特的价值观。

2013-07-10 17:51:55.329 MyApp[1634:c07] Number of Objects in Array 7
2013-07-10 17:51:55.330 MyApp[1634:c07] From ArrayTag obj: 4
2013-07-10 17:51:55.330 MyApp[1634:c07] From ArrayTag obj: 5
2013-07-10 17:51:55.330 MyApp[1634:c07] From ArrayTag obj: 5
2013-07-10 17:51:55.330 MyApp[1634:c07] From ArrayTag obj: 5
2013-07-10 17:51:55.331 MyApp[1634:c07] From ArrayTag obj: 6
2013-07-10 17:51:55.331 MyApp[1634:c07] From ArrayTag obj: 6
2013-07-10 17:51:55.331 MyApp[1634:c07] From ArrayTag obj: 4

问:为什么重新排序后我没有获得新的独特价值?如何获取保存在数组中的新单元格顺序?

3 个答案:

答案 0 :(得分:5)

代表和数据源澄清

您不应在以下期间修改tableView背后的数据:

-tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:

当用户将单元格悬停在其他单元格之上时,会调用此方法,因此,在拖动单元格时会导致多次调用此函数。

这里的关键是,该方法是UITableViewDelegate的一部分,它不是为了修改数据,而是改变了tableView的外观,而它只是在那里“滑动“细胞悬停时的动画。返回的值确定应将单元格设置为动画的位置。

您应该做的是,在用户提交更改时执行更改,这是在您调用UITableViewDataSource协议方法时发生的:

-tableView:moveRowAtIndexPath:toIndexPath:

这是当用户释放了单元格并且它已就位的情况,并且每次拖动时都会发生一次。下降。

作为一般经验法则,UITableViewDelegate上的任何内容都适用于节目,UITableViewDataSource上的内容适用于真实数据。

修改模型

交换来实现

交换或交换是最简单的情况([ A ,B,C, D ] => [ D ,B, C, A ]),有一种非常方便的方法:

[arrayTag exchangeObjectAtIndex:fromIndexPath.row withObjectAtIndex:toIndexPath.row];

夫特

let f = fromIndexPath.row, t = toIndexPath.row
(array[f], array[t]) = (array[t], array[f])

插入

插入有点棘手和冗长([ A ,B,C, D ] => [B,C, D A ])。重要的是进行更改,使它们不会相互影响。

id obj = [arrayTag objectAtIndex:fromIndexPath.row];
[arrayTag removeObjectAtIndex:fromIndexPath.row];
[arrayTag insertObject:obj atIndex:toIndexPath.row];

夫特

let obj = array.removeAtIndex(fromIndexPath.row)
array.insert(newElement: obj, atIndex: toIndexPath.row)

答案 1 :(得分:2)

我终于找到了适用于Apple文档的解决方案。

声明NSMutableArray属性.h或.m:@property (strong, nonatomic) NSMutableArray *arrayTag;

合成它:@synthesize arrayTag;

viewDidLoad arrayTag = [[NSMutableArray alloc] init];

中对其进行初始化

以下是代码:

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    NSString *stringToMove = [arrayTag objectAtIndex:sourceIndexPath.row];
    [arrayTag removeObjectAtIndex:sourceIndexPath.row];
    [arrayTag insertObject:stringToMove atIndex:destinationIndexPath.row];
}

链接到Apple的网站:清单8-2:http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/ManageReorderRow/ManageReorderRow.html

答案 2 :(得分:0)

如果要交换两个对象,则必须在临时位置保存对象:

psuedocode

arr = [a,b,c]

//to swap(0,2)...

tmp = arr[2]

[arr replaceObjectAtIndex: 2 withObject: arr[0]]

[arr replaceObjectAtIndex: 0 withObject:tmp];