按日期排序UICollectionView

时间:2017-01-14 15:07:57

标签: ios objective-c uicollectionview nsarray

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

以下是我的集合视图代码:

-(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;
}

enter image description here

2 个答案:

答案 0 :(得分:1)

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

enter image description here

另一种方法是根据密钥订购商品。你可以这样做:

-(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;
}

答案 1 :(得分:1)

不要将您的数据存储为字典。字典本质上是无序集合。使它成为一个字典数组,按日期排序。

一旦你有一个项目数组,你可以使用:

在部分和行中获取它

编辑:

在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

列将是集合中的列数。

numberOfSections将是您的收藏中的部分总数。您可以在numberOfSectionsInCollectionView函数中返回该内容。

indexOfCell会根据请求的部分和行为您提供对象数组的索引。您可以使用它来获取cellForItemAtIndexPath函数中的对象。

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