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

时间:2014-01-23 11:17:23

标签: ios iphone uitableview nsdate

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

我正在使用SQLITE3。

enter image description here

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

我搜索了很多,但我无法弄清楚任何事情,

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

向所有人致意。

5 个答案:

答案 0 :(得分:3)

如果我错了,请纠正我,

正如所有人建议的那样,在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];
...
}

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

1.使用带有键的字典作为月份和值作为那些事件的字典来到那个月。

2.更新主词典后,只需重新加载uitableview。考虑将no作为主要字典键计数和每个部分中的单元格作为子字典键计数。

答案 3 :(得分:1)

这是你的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;
}

答案 4 :(得分:1)

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

return [dictionary.allKeys count]

您可以获得每个部分的行数

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