有关使用名为rows的字符串的NSMutableArray的简单示例,我必须在表控制器中实现什么才能移动tableView行并将更改反映在我的数组中?
在这里,我们做重物.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); // fetch the object at the row being moved NSString *r = [rows objectAtIndex:fromIndexPath.row]; // remove the original from the data structure [rows removeObjectAtIndex:fromIndexPath.row]; // insert the object at the target row [rows insertObject:r atIndex:toIndexPath.row]; NSLog(@"result of move :\n%@", [self rows]); }
由于这是一个基本示例,因此让所有行都可以移动.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { return YES; }
上述任何一种都不会起作用.在原始发布的代码中,tableview将崩溃,因为它会删除仍在使用的数据,即使在更正之后,由于表格执行"重新排列",数组也不会有正确的数据.
exchangeObjectAtIndex:withObjectAtIndex:根据tableview如何实现自己的重新排列,不能用于重新排列数组
为什么?因为当用户选择一个表格单元格来重新排列它时,该单元格不会与它们移动到的单元格交换.他们选择的单元格将插入新行索引,然后删除原始单元格.至少这是它对用户的看法.
解决方案:由于tableview实现重新排列的方式,我们需要执行检查以确保添加和删除右行.我把这个代码放在一起很简单,对我来说非常适合.
使用原始发布的代码数据作为示例:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); // fetch the object at the row being moved NSString *r = [rows objectAtIndex:fromIndexPath.row]; // checks to make sure we add and remove the right rows if (fromIndexPath.row > toIndexPath.row) { // insert the object at the target row [rows insertObject:r atIndex:toIndexPath.row]; // remove the original from the data structure [rows removeObjectAtIndex:(fromIndexPath.row + 1)]; } else if (fromIndexPath.row < toIndexPath.row) { // insert the object at the target row [rows insertObject:r atIndex:(toIndexPath.row + 1)]; // remove the original from the data structure [rows removeObjectAtIndex:(fromIndexPath.row)]; } }
如果您花一点时间看看重新排列期间桌面视图会发生什么,您就会明白我们为什么要添加1的位置.
我对xcode很新,所以我知道可能有一种更简单的方法可以做到这一点,或者代码可能会被简化....只是想尽力帮助我,因为我花了几个小时才想到这个出.希望这能节省一些时间!
根据Apple的文档和我自己的经验,这是一些非常好的代码:
NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain]; [self.rows removeObjectAtIndex:fromIndexPath.row]; [self.rows insertObject:tempObj atIndex:toIndexPath.row]; [tempObj release];