所以我有NSDictionary项目的NSMutableArray。每个NSDictionary项都有一个键" name"应该用于按字母顺序对数组进行排序。除了"排序"部分工作。它不按精确的字母顺序排序。它按顺序移动了一些字典,但却使一些字典无序。
NSMutableArray *section1 = [champs lastObject];
NSArray *oldSection1 = [NSArray arrayWithArray:section1];
[section1 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSDictionary *dictA = (NSDictionary *)obj1;
NSDictionary *dictB = (NSDictionary *)obj2;
NSString *champName1 = dictA[@"name"];
NSString *champName2 = dictB[@"name"];
return [champName1 compare:champName2];
}];
// Animation
for (NSDictionary *champInfo2 in section1) {
if ([oldSection1 indexOfObject:champInfo2] != [section1 indexOfObject:champInfo2]) {
[self.collectionView moveItemAtIndexPath:[NSIndexPath indexPathForItem:[oldSection1 indexOfObject:champInfo2] inSection:1] toIndexPath:[NSIndexPath indexPathForItem:[section1 indexOfObject:champInfo2] inSection:1]];
}
}
我甚至试过这段代码
NSMutableArray *section1 = [champs lastObject];
NSArray *oldSection1 = [NSArray arrayWithArray:section1];
/*[section1 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSDictionary *dictA = (NSDictionary *)obj1;
NSDictionary *dictB = (NSDictionary *)obj2;
NSString *champName1 = dictA[@"name"];
NSString *champName2 = dictB[@"name"];
return [champName1 compare:champName2];
}];*/
section1 = [[NSArray arrayWithArray:section1] sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]].mutableCopy;
// Animation
for (NSDictionary *champInfo2 in section1) {
if ([oldSection1 indexOfObject:champInfo2] != [section1 indexOfObject:champInfo2]) {
[self.collectionView moveItemAtIndexPath:[NSIndexPath indexPathForItem:[oldSection1 indexOfObject:champInfo2] inSection:1] toIndexPath:[NSIndexPath indexPathForItem:[section1 indexOfObject:champInfo2] inSection:1]];
}
}
好的问题是我在重新组织之前没有更新我的内容快照,因为我直观地更新了它。更新的代码:
// Animation
for (NSDictionary *champInfo2 in section) {
if ([oldSection indexOfObject:champInfo2] != [section indexOfObject:champInfo2]) {
[self.collectionView moveItemAtIndexPath:[NSIndexPath indexPathForItem:[oldSection indexOfObject:champInfo2] inSection:[champs indexOfObject:section]] toIndexPath:[NSIndexPath indexPathForItem:[section indexOfObject:champInfo2] inSection:[champs indexOfObject:section]]];
[oldSection removeObject:champInfo2];
[oldSection insertObject:champInfo2 atIndex:[section indexOfObject:champInfo2]];
}
}
答案 0 :(得分:1)
代码的上半部分(即排序)工作正常。如果你使用排序描述符,它可以简化,但绝对不是问题。
真正的问题在于移动事物的代码。
在第一次移动之前,self.collectionView
和XYZ
的索引处于同步状态,即i
项oldSection1
位于i
的索引self.collectionView
,然后它也在self.collectionView
中的索引oldSection1
。
然而,在第一次移动之后,索引变得不同步,因为此移动仅在oldSection1 = C D A B
collectionView = C D A B
中执行,而在sorted = A B C D
中不执行。例如,如果您从
C
你希望它是
oldSection1 = C D A B
collectionView = A C D B
首次移动D
之后,数据看起来像
C
当需要将oldSection1
移至新位置时,self.collectionView
会被移动。
要解决此问题,请使SearchView
变为可变,并在SearchView
中移动时执行“并行”移动。
答案 1 :(得分:0)
看起来您的实际数据是正确的,但是您的集合视图正在错误地显示它们,因为您正在迭代数据,一次移动一行。这很可能导致重新排序已经重新排序的行。
调用TypographicFont.FromFile
而不是手动移动行应解决此问题。
答案 2 :(得分:0)
要执行多个UICollectionView项目更新(插入/删除/移动),建议使用performBatchUpdates:completion:
。否则您可能会遇到无效索引。