Sort UITableView into sections by date from Array of events

后端 未结 1 966
-上瘾入骨i
-上瘾入骨i 2021-01-06 07:35

I\'ve retrieved data from 2 different shared Google Calendars, and stored the data in an array. I need to sort the data into a sectioned UITableView, sorted by date.

<
1条回答
  •  生来不讨喜
    2021-01-06 07:38

    First group all your events - you'll have to take care of variable scoping (I'm using days and groupedEvents locally but you'll have to declare those as ivars/properties)

        NSMutableArray *days = [NSMutableArray array];
        NSMutableDictionary *groupedEvents = [NSMutableDictionary dictionary];
    
    - (void)groupEventsIntoDays
    {
        for (CalendarModel *event in _events)
        {
            NSString *dato = [[event.time objectAtIndex:0] startTime];
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSzzz";
            NSDate *gmtDate = [formatter dateFromString: dato];
    
            if (![days containsObject:gmtDate])
            {
                [days addObject:gmtDate];
                [groupedEvents setObject:[NSMutableArray arrayWithObject:event] forKey:gmtDate];
            }
            else
            {
                [((NSMutableArray*)[groupedEvents objectForKey:gmtDate]) addObject:event];
            }
        }
    
        days = [[days sortedArrayUsingSelector:@selector(compare:)] mutableCopy];
    }
    

    Section headers:

    -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width, 30)];
        UILabel *headerLabel = [[UILabel alloc] initWithFrame:header.bounds];
        [header addSubview:headerLabel];
    
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"dd-MM-yyyy HH:mm";
        NSString *dateAsString = [formatter stringFromDate:[days objectAtIndex:section]];
    
        [headerLabel setText:dateAsString];
    
        return header;
    }
    

    I only touched the first two lines in your cellForRow - you can modify the rest as needed for display/formatting:

    -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        NSDate *date = [days objectAtIndex:indexPath.section];
        CalendarModel *event = [((NSMutableArray*)[groupedEvents objectForKey:date]) objectAtIndex:indexPath.row];
    
        NSString *dato = [[event.time objectAtIndex:0] startTime];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSzzz";
        NSDate *gmtDate = [formatter dateFromString: dato];
        formatter.dateFormat = @"dd-MM-yyyy HH:mm";
        dato = [formatter stringFromDate:gmtDate];
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SportCell" forIndexPath:indexPath];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",
                               event.title
                               ];
        cell.detailTextLabel.text = dato;
    
        return cell;
    }
    

    0 讨论(0)
提交回复
热议问题