的UITableView Moverows崩溃

问题描述:

我是相当新的Objective-C和我有programming.So我的问题的一些经验如下:的UITableView Moverows崩溃

我使用

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
    toIndexPath:(NSIndexPath *)toIndexPath 

{ 

    NSString *item = [test objectAtIndex:[fromIndexPath row]]; 

    [test removeObject:item]; 

    [test insertObject:item atIndex:[toIndexPath row]]; 

} 

,这样我可以移动的行如果测试数组中的对象是唯一的,那么一切正常。但是当两个或更多对象相同时,应用程序崩溃。例如,如果数组中的字符串是:@“BOB”,@“LINDA” ,“JOHN”,我可以移动行很好。但当字符串是:@“BOB”,@“LINDA”,@“JOHN”,@“BOB”,“@BOB”应用程序崩溃

具有以下原因:

*终止应用程序由于未捕获的异常 'NSRangeException',原因: ' - [__ NSCFArray insertObject:atIndex:]:索引(2)超出界限(1)'

你能帮我吗? 谢谢。

+0

您是否尝试过先添加项目然后删除它? – Ares 2013-02-22 15:23:30

的地址具有相同字符的字符串应该是相同的(常量指针),因此如果删除了一个项目@“BOB”,那么如果其中存在另一个字符串@“BOB”,则可能将它们从数组中移除。

我宁愿使用removeObjectAtIndex函数,而不是与对象相关的remove函数,并在必要时将插入索引路径调整为-1(如果索引路径位于from索引路径的后面)。

注意

我只是做了一个小测试,事实上从一个阵列,两次该字符串删除两个字符串删除@“BOB”。

+0

谢谢你们两位!removeObjectAtIndex做了诀窍!很高兴有知识的人准备好帮忙!谢谢你们。 – coddoc 2013-02-22 15:47:35

当您使用insertObject:atIndex:你必须确保指数,用于插入的对象,是不是大于或等于[array count],否则你必须使用[array addObject:item]

试着这么做:

NSString *item = [test objectAtIndex:[fromIndexPath row]]; 
[test removeObject:item]; 
if ([toIndexPath row] < [test count]) { 
    [test insertObject:item atIndex:[toIndexPath row]]; 
} 
else { 
    [test addObject:item]; 
} 
+0

谢谢你的回答。是的,我明白了,但是当物体不同时它是如何工作的,但是当物体是相同的时候会发生碰撞? – coddoc 2013-02-22 15:29:38

+0

而不是'[test removeObject:item]',尝试使用'[test removeObjectAtIndex:[fromIndexPath row]]' – 2013-02-22 15:36:00

+0

谢谢你们两位!removeObjectAtIndex做了个窍门!很高兴有知识的人准备帮忙!谢谢大家。 – coddoc 2013-02-22 15:46:53