排序NSD阵列的NSArray ...不完全正常工作

时间:2015-04-25 20:51:43

标签: ios objective-c sorting

所以我有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]];
                    }
                }

3 个答案:

答案 0 :(得分:1)

代码的上半部分(即排序)工作正常。如果你使用排序描述符,它可以简化,但绝对不是问题。

真正的问题在于移动事物的代码。

在第一次移动之前,self.collectionViewXYZ的索引处于同步状态,即ioldSection1位于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:。否则您可能会遇到无效索引。

Link to official Apple's documentation