按 NSDate 对表格部分进行排序 [英] Sorting table sections by NSDate

查看:54
本文介绍了按 NSDate 对表格部分进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何对 NSDate 进行排序,以便如果某个日期的时间是周日早上 05:00,它会停留在周六晚上",但最后出现在列表中?

How do I sort NSDate so that if a time on a date is 05:00 Sunday morning, it stays on Saturday "night", but last on the list?

我从 JSON 数据中按日期对我的 tableview 部分进行排序

I sort my tableview sections by date from JSON data

[[API sharedInstance] commandWithParams:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"fodboldStream", @"command", nil] onCompletion:^(NSDictionary *json) {

    //got stream
    //NSLog(@"%@",json);
    [[API sharedInstance] setSoccer: [json objectForKey:@"result" ]];

    games = [json objectForKey:@"result"];


    sections = [NSMutableDictionary dictionary];

    for (NSDictionary *game in games) {
        NSNumber *gameType = game[@"dato"];
        NSMutableArray *gamesForType = sections[gameType];
        if (!gamesForType) {
            gamesForType = [NSMutableArray array];
            sections[gameType] = gamesForType;
        }
        [gamesForType addObject:game];


    }
   // NSLog(@"%@",sections);

    [fodboldTabel reloadData];
}];

这是我的部分标题:

- (NSString*) tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section {

    //...if the scetions count is les the 1 set title to opdating ...

    if ([[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section]] count] < 1) {
        return @"Opdater....";

    } else {

        // ..........seting tabelheader titel to day and date..................
        NSString *str = [[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section];

        NSDate *date = [NSDate date];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init] ; // here we create NSDateFormatter object for change the Format of date..
        [dateFormatter setDateFormat:@"yyyy-MM-dd"]; //// here set format of date which is in your output date (means above str with format)
        date = [dateFormatter dateFromString:str];

        dateFormatter.locale=[[NSLocale alloc] initWithLocaleIdentifier:@"da_DK"];

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

        dateFormatter.dateFormat=@"EEEE";
        NSString * dayString = [[dateFormatter stringFromDate:date] capitalizedString];

        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSInteger units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday;
        NSDateComponents *components = [calendar components:units fromDate:date];

        NSInteger year = [components year];
        //  NSInteger month=[components month];       // if necessary
        NSInteger day = [components day];
        //NSInteger weekday = [components weekday]; // if necessary


        NSString *sectionLbl = [NSString stringWithFormat: @"%@ %li %@ %li", dayString, (long)day, monthString, (long)year];
        return sectionLbl;
    }
}

这是一张图片,你可以看到标题上写着 søndag(Sunday) 并且比赛在上午 01:35 开始,所以比赛在星期天早上的电视上播放,但我希望在星期六播放.部分......所以实际上我只是在一天"从早上 5 点到早上 5 点而不是 00:00 - 00:00

Here is a image, as you can see the header says søndag(Sunday) and the game start 01:35 am so the game is shown on tv sunday morning but i want that in Saturday. section..... so actually i just wat the "day" to go from 5am to 5am instead of 00:00 - 00:00

推荐答案

您应该确定一个 timeZone 与一个 NSDateFormatter 结合使用,以便在构造部分时使用标题.

You should identify a timeZone to use in conjunction with a NSDateFormatter to be used when constructing the section headers.

例如,下面我展示了一系列事件,按 when 属性排序,但部分标题将位于某个预定的时区,而不是我设备的特定时区.所以,我首先使用适当的 NSTimeZone 的日期格式化程序构建我的模型来支持我的表(一个 Section 对象数组,每个对象都有一个 items 数组):

For example, below I show a series of events, sorted by the when property, except that the section headers will be in some predetermined timezone, not my device's particular timezone. So, I first build my model backing my table (an array of Section objects, each which has an array of items) using a date formatter of the appropriate NSTimeZone:

// Given some array of sorted events ...

NSArray *sortedEvents = [events sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"when" ascending:YES]]];

// Let's specify a date formatter (with timezone) for the section headers.

NSDateFormatter *titleDateFormatter = [[NSDateFormatter alloc] init];
titleDateFormatter.dateStyle = NSDateFormatterLongStyle;
titleDateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];   // use whatever you want here; I'm just going to figure out sections in GMT even though I'm currently in GMT-5

// Now let's build our array of sections (and the list of events in each section)
// using the above timezone to dictate the sections.

self.sections = [NSMutableArray array];

NSString *oldTitle;
for (Event *event in sortedEvents) {
    NSString *title = [titleDateFormatter stringFromDate:event.when]; // what should the section title be

    if (![oldTitle isEqualToString:title]) {                          // if different than last one, add new section
        [self.sections addObject:[Section sectionWithName:title]];
        oldTitle = title;
    }

    [[(Section *)self.sections.lastObject items] addObject:event];    // add event to section
}

但是,当我显示单元格内容时,如果我不触摸 timeZone 参数,它将默认显示当前时区的实际时间.

But, when I'm displaying the cell contents, if I don't touch the timeZone parameter, it will default to showing the actual time in the current timezone.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"EventCell";
    EventCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    Section *section = self.sections[indexPath.section];
    Event *event = section.items[indexPath.row];

    // This formatter really should be class property/method, rather than instantiating 
    // it each time, but I wanted to keep this simple. But the key is that
    // I don't specify `timeZone`, so it defaults to current timezone.

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    formatter.timeStyle = NSDateFormatterMediumStyle;

    cell.eventTimeLabel.text = [formatter stringFromDate:event.when];

    // do additional cell population as you see fit

    return cell;
}

对于部分标题,使用我在构建支持此表视图的模型的例程中想出的部分名称(即,使用该硬编码时区).

For section header, use that section name I came up with in the routine that built the model backing this table view (i.e., using that hard-coded timezone).

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [(Section *)self.sections[section] sectionName];
}

如您所见,时间列在当前时区中,但它们按我在构建节列表的代码中指定的预定 NSTimeZone 分组.

As you can see, the times are listed in current time zone, but they are grouped by the predetermined NSTimeZone I specified in the code that built the list of sections.

显然,我只使用 GMT 作为我的时区,但您可能想要使用活动场地或 NBA 篮球的时区,一些任意的美国时区.但希望这说明了基本思想.创建部分时使用一个时区,显示实际时间时使用默认时区.

Clearly, I just used GMT for my timezone, but you might want to use the timezone for the venue of the event or for NBA basketball, some arbitrary US timezone. But hopefully this illustrates the basic idea. Use one timezone when creating the sections, and the default timezone when showing the actual time.

这篇关于按 NSDate 对表格部分进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆