获取 tableview insertRowsAtIndexPaths 以接受 indexOfObject?

Posted

技术标签:

【中文标题】获取 tableview insertRowsAtIndexPaths 以接受 indexOfObject?【英文标题】:Get a tableview insertRowsAtIndexPaths to accept indexOfObject? 【发布时间】:2010-04-30 20:28:32 【问题描述】:

我的代码 sn-p 如下所示:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[array indexOfObject:[array objectAtIndex:indexPath.row]]] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];
[tableView reloadData];

当用户点击一个附件时它会被执行。第一部分只是为了提供流畅的动画,并不重要,因为 tableView 会在几毫秒后重新加载,但正如我所说,它是为了提供动画。

它应该将选定的对象从其当前 indexPath 移动到同一 indexPath 的数组中的值。

显然,这段代码不起作用,所以我只想知道可以做些什么来修复它?

PS:编译时我也会收到警告。通常的“'arrayWithObject:' 的传递参数 1 使指针从整数而不进行强制转换......”(第 3 行)

以这个 sn-p 结束:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:[array indexOfObject:[arraySubFarts objectAtIndex:indexPath.row]] inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

[tableView reloadData];

【问题讨论】:

【参考方案1】:

您可以使用NSIndexPath 类扩展方法+indexPathForRow:inSection: 将行转换为索引路径。更多详情here.

如果您删除和插入行的唯一目的是引起动画,您是否考虑过reloadRowsAtIndexPaths:withRowAnimation: 方法?

【讨论】:

【参考方案2】:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[array indexOfObject:[array objectAtIndex:indexPath.row]]] withRowAnimation:UITableViewRowAnimationLeft];

将这条线拆分出来,你会得到以下结果:

NSObject *obj = [array objectAtIndex:indexPath.row];
int *index = [array indexOfObject:obj];
NSArray *otherArray = [NSArray arrayWithObject:index];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

你可能想要的是:

NSObject *obj = [array objectAtIndex:indexPath.row];
NSIndexPath *index = [NSIndexPath indexPathForRow:[array indexOfObject:obj] inSection:0];
NSArray *otherArray = [NSArray arrayWithObject:index];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

但是你为什么不能这样做呢?

NSArray *otherArray = [NSArray arrayWithObject:indexPath];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

使用索引从数组中获取对象,然后使用对象查找索引似乎是多余的。只需使用索引即可。


用更多代码编辑:

NSNumber *obj = [NSNumber numberWithInt:indexPath.row];
int *index = [array indexOfObject:obj];
NSIndexPath *index = [NSIndexPath indexPathForRow:index inSection:0];
NSArray *otherArray = [NSArray arrayWithObject:index];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

【讨论】:

我这样做的原因是因为新索引位于数组中的当前 indexPath 处。 (如果 indexPath 为 2,则数组中 2 的值可能为 20)。 啊,好的。您发布的代码所做的是在索引 2 处获取对象,在索引 2 处查找对象的索引,并使用该对象创建一个数组。我在上面添加了更多代码,可能更接近您的需要。

以上是关于获取 tableview insertRowsAtIndexPaths 以接受 indexOfObject?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tableView:(UITableView *)tableView heightForRowAtIndexPath 函数中获取单元格对象?

通过 Alamofire,想获取数据并将其插入 TableView,但在完成插入之前,TableView 已加载

从选定的单元格获取数据(TableView)

获取 UITableViewCell 索引以响应位于 tableview 中的 tableview 中的按钮单击的正确方法?

如何获取tableview中当前选中的cell

从自定义 Tableview 部分标题中获取 indexPath