按日期排序 UICollectionView

Sort UICollectionView by Date

我的应用包含一个 plist 文件,它是我的 UICollectionView 数据。 plist 看起来像这样:

这是我的集合视图代码:

-(NSArray *)content {
    if (!_content) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask,
                                                             YES);
        NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
        NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
        _content = [help allValues];
        _titles = [help allKeys];
        NSLog(@"CONTENT%@", _content);
    }
    return _content;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
       return [self.content count];
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {


    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"MM/dd/yyyy";
    NSDate *date = [dateFormatter dateFromString:[self.titles objectAtIndex:indexPath.row]];

    dateFormatter.dateFormat=@"MMMM";
    NSString *monthString = [[dateFormatter stringFromDate:date] capitalizedString];

    dateFormatter.dateFormat=@"dd";
    NSString *dayString = [dateFormatter stringFromDate:date];
    static NSString *cellIdentifier = @"cvCell";

    CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];


    [cell.labels setText:[[self.content objectAtIndex:indexPath.row] valueForKey:@"verse"]];
    [cell.month setText:monthString];
    [cell.day setText:dayString];

    return cell;
}

视图如下所示: 如您所知,这与我希望的布局方式不太一样。我更喜欢从左到右、从上到下的顺序,或者最新的条目在前,但我不太明白。对我如何完成这个有什么建议吗?

更新:

我添加了一个 NSArray 并使用它首先从 plist 获取数据,然后使用 NSSortDescriptor 创建 _content 数组。在NSLog中,它按照我想要的顺序显示,但最终结果没有改变:

-(NSArray *)content {
    if (!_content) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask,
                                                             YES);
        NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
        NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
        _sortedArray = [help allValues];
        _titles = [help allKeys];


        NSSortDescriptor* nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"theDate" ascending:NO];
        _content = [_sortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameSortDescriptor]];
        NSLog(@"%@", _content);
    }
    return _content;
}

有两种方法可以做到这一点。一种是将您的 plist 设置为在根级别包含一个数组而不是字典(参见屏幕截图)。这确保您保留项目的顺序(字典没有顺序)。

另一种方法是根据键对项目进行排序。您可以按如下方式执行此操作:

-(NSArray *)content {
    if (!_content) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask,
                                                             YES);
        NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
        NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
        _titles = [help allKeys];

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"MM/dd/yyyy";

        NSArray *sortedTitles = [_titles sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {

            NSDate *date1 = [dateFormatter dateFromString:obj1];
            NSDate *date2 = [dateFormatter dateFromString:obj2];
            return [date1 compare:date2];
        }];

        _sortedArray = [[NSMutableArray alloc] init];

        for (NSString *title in sortedTitles) {
            [_sortedArray addObject:[help objectForKey:title]];
        }
        _content = _sortedArray;
        NSLog(@"%@", _content);
    }
    return _content;
}

不要将数据存储为字典。字典本质上是无序的 collections。使其成为字典数组,按日期排序。

一旦你有了一个项目数组,你可以使用以下方法分段和行获取它:

编辑:

在Objective-C

NSInteger columns = 3;

NSInteger numberOfSections = (NSInteger) ceil( count/(double)columns));

NSInteger indexOfCell = indexPath.section * columns + indexPath.row;

在Swift

let columns  = 3

let numberOfsections = Int(ceil(Double(array.count) / Double(columns)))

let indexOfCell = indexPath.section * columns + indexPath.row

Columns 将是您 collection.

中的列数

numberOfSections 将是您 collection 中的部分总数。你 return 在你的 numberOfSectionsInCollectionView 函数中。

indexOfCell 会根据请求的部分和行为您提供 object 数组的索引。您将使用它在 cellForItemAtIndexPath 函数中获取 object。

或者,您可以将数据存储为字典数组的数组,其中外部数组是您的部分,内部数组是每个部分的行,每个字典将是该单元格的数据。