从Unix时间戳日期ios数组在Uitableview中创建动态部分?

Posted

技术标签:

【中文标题】从Unix时间戳日期ios数组在Uitableview中创建动态部分?【英文标题】:Create dynamic Sections in Uitableview from array of Unix timestamp Date ios? 【发布时间】:2014-01-23 11:17:22 【问题描述】:

我有表事件,其中日期存储在 Unix 时间戳格式(即 1390680000)中,我想用 Month Wise 在 uitableview 中显示它,

我正在使用 SQLITE3。

喜欢,

aray Events:(
        
        Id = 67;
        SDate = 1390680000;
       ,
       
        Id = 68;
        SDate = 1395600000;
       
.
.
.

我查了很多,但我什么都想不通,

那么,我如何从 Unix 时间戳日期 ios 在 Uitableview 中创建动态部分?

谢谢大家。

【问题讨论】:

这个顺序实际上是“年、月”而不是“月”(即 2011 年 4 月会紧随 2012 年 4 月)吗? @***foe: 好的,我也将格式化程序更改为 yy,但是如何使用它创建数组数组。 我要求您澄清要求。 @***foe:我更新了问题。请检查。 【参考方案1】:

如果我错了,请纠正我,

正如大家所建议的,在 Dictionary 中使用 Array of Dictionary 放置两个对象,一个是 Title (Nsstring),第二个是 NSArray ( dict 代表单元格细节),

我已经在我的应用中实现了一种方法,

注意:为您的数据使用您的键值。

使用以下代码排列数组,

-(NSMutableArray*)arrangeSection:(NSMutableArray *)source

    NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
    [_formatter setLocale:[NSLocale currentLocale]];
    [_formatter setDateFormat:@"MMMM"];
    NSMutableArray *arrayMain=[NSMutableArray array];
    for (int i=0; i<source.count; i++)
        NSDictionary *dict=source[i];
        NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[dict objectForKey:@"StartDate"]doubleValue]];
        NSString *mm=[_formatter stringFromDate:date];
        NSMutableDictionary *secDict=[NSMutableDictionary dictionary];
        NSMutableArray *secArray=[NSMutableArray array];

        if (i==0)
            [secDict setObject:mm forKey:@"Month"];
            [secArray addObject:dict];
            [secDict setObject:secArray forKey:@"Data"];
            [arrayMain addObject:secDict];
        
        else
            BOOL flg=NO;
            for (NSDictionary *dict2  in arrayMain)
                if([[dict2 objectForKey:@"Month"]isEqualToString:mm])
                    flg=YES;
                    [[dict2 objectForKey:@"Data"]addObject:dict];
                    break;
                
            

            if (!flg)
                [secDict setObject:mm forKey:@"Month"];
                [secArray addObject:dict];
                [secDict setObject:secArray forKey:@"Data"];
                [arrayMain addObject:secDict];

            
        
    
    return arrayMain;

现在在 tableview 方法中使用 as,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    return arrayEvents.count;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

        return [[arrayEvents[section]objectForKey:@"Data"]count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

...
  NSDictionary *aDict = [arrayEvents objectAtIndex:indexPath.section];
            NSDictionary *maindict=[[aDict objectForKey:@"Data"]objectAtIndex:indexPath.row];
...

【讨论】:

感谢回答,但我必须使用什么日期键? 因为我有注意使用你的钥匙,在我的回答中我有一个对象 StartDate ,据我所知,我已经安排了这一切,你可以在这里使用你的钥匙。跨度> 【参考方案2】:

根据 sateesh 的建议,示例代码如下,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
   [dictname count];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
        if (section == 0) 
           return [[dictname valueforkey:@"key1"] count];
         else 
            return [[dictname valueforkey:@"key1"] count];
        


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    if (indexPath.section == 0) 
       // particular code
     else 
      // particular code
    

【讨论】:

对不起,我没看懂这段代码,你能把代码用于排列数组吗?【参考方案3】:

1.使用字典,其中键为月份,值作为那些事件的字典,这些事件的字典在该月份以下。

2.更新主词典后,只需重新加载 uitableview。将节数视为主字典键数,将每个节中的单元格视为子字典键数。

【讨论】:

【参考方案4】:

我认为您应该将数据格式化为NSDictionary,并以月份为键,并且每个键都将具有按排序顺序排列的消息数组。那么部分的数量将是

return [dictionary.allKeys count]

你可以得到每个部分的行数是

NSArray *messages = [dictionary obejctForKey:indexPath.section]; return [messages count]

【讨论】:

【参考方案5】:

这是你的fetchresultController,注意groupedByMonthYear

[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[DeputyCoreDataManager sharedManager].mainQueueManagedObjectContext sectionNameKeyPath:@"dttStartTime.groupedByMonthYear" cacheName:nil];

这是您的 NSDate+Enhance.m 类别中的功能之一,请根据您的日期格式进行更改。

- (NSString *)groupedByMonthYear
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit fromDate:self];
    NSString *monthString = [NSString stringWithFormat: @"%d", [components month]];

    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM"];
    NSDate* myDateMonth = [dateFormatter dateFromString:monthString];

    [dateFormatter setDateFormat:@"yyyy"];
    NSString *stringFromYear = [NSString stringWithFormat:@"%@",[dateFormatter stringFromDate:self]];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MMMM"];
    NSString *stringFromMonth = [formatter stringFromDate:myDateMonth];

    return [NSString stringWithFormat:@"%@ %@", stringFromMonth, stringFromYear];


编辑:

对于非核心数据解决方案,它是直截了当的。 1. 您创建一个 NSMutableDictionary,其中键作为日期,值作为事件数组。 2. 循环浏览所有事件,得到该事件当月的第一个日期。然后检查字典中是否有键,如果存在,则获取值,这是一个数组。并将您的事件插入该数组。如果键不存在,则创建一个数组,将数组放入地图中,然后添加您的事件。

NSMutableDictionary *eventsMap = @.mutableCopy;
    for (Event *event in data) 
        NSDate *firstDateOfMonth = event.date.firstDateOfMonth;
        NSMutableArray *events = [eventsMap objectForKey:firstDateOfMonth];
        if (!events) 
            events = @[].mutableCopy;
            [eventsMap setObject:events forKey:firstDateOfMonth];
        
        [events addObject:event];
    

至于表格视图

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
   [eventsMap count];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
        //TODO: need sorting
        Array *sortedKeys = [eventsMap allKeys];
        return [sortedKeys objectAt:section];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        //TODO: need sorting
        Array *sortedKeys = [eventsMap allKeys];
        return [[eventsMap objectForKey:[sortedKeys objectAt:indexPath.section]] objectAt:indexPath.row];
    


-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
    Array *sortedKeys = [eventsMap allKeys];
    NSDate *titleDate = [sortedKeys objectAt:section];
    return titleDate.groupedByYearMonth;

【讨论】:

我没有使用核心数据,如何将其存储在数组中? Thnks ,但我怎样才能检索节标题名称? 请检查我之前提供的groupedByMonthYear函数,你可以这样格式化。它不是优化的代码,请在您认为合适的地方进行优化。基本思想是,您获取日期并对其进行格式化。

以上是关于从Unix时间戳日期ios数组在Uitableview中创建动态部分?的主要内容,如果未能解决你的问题,请参考以下文章

从unix时间戳获取GMT日期[重复]

如何从 JS 中的 Y-m-d 日期获取 unix 时间戳?

如何从给定城市的给定日期和时间获取 unix 纪元时间戳(以秒为单位)?

使用 sql 将字符串纪元代码从 unix 时间戳转换为日期

pandas使用to_datetime函数将unix时间戳转化为日期时间格式(Convert Unix times to DateTime)

将 Unix 时间戳转换为日期字符串