gpt4 book ai didi

ios - 从事件数组中按日期将 UITableView 分类为多个部分

转载 作者:可可西里 更新时间:2023-11-01 05:03:22 24 4
gpt4 key购买 nike

我从 2 个不同的共享 Google 日历中检索了数据,并将数据存储在一个数组中。我需要将数据排序到一个分段的 UITableView 中,按日期排序。

这是我的代码:

日历模型.h

#import "JSONModel.h"
#import "Time.h"

@interface CalendarModel : JSONModel

@property (strong, nonatomic) NSString* title;
@property (strong, nonatomic) NSArray<Time>* time;

@end

日历模型.m

#import "CalendarModel.h"

@implementation CalendarModel


+(JSONKeyMapper*)keyMapper
{
return [[JSONKeyMapper alloc] initWithDictionary:@{
@"gd$when": @"time",
@"title.$t": @"title",
}];
}

@end

时间.h

#import "JSONModel.h"

@protocol Time @end

@interface Time : JSONModel

@property (strong, nonatomic) NSString* startTime;
@property (strong, nonatomic) NSString* endTime;

@end

Time.m 什么都不做,因为它由 JSONModel 处理

SportsViewController.m

#import "SportsViewController.h"
#import "JSONModelLib.h"
#import "CalendarModel.h"
#import "Time.h"
#import "JSONValueTransformer.h"

@interface SportsViewController ()

@property (strong, nonatomic) NSMutableArray *events;
@property (strong, nonatomic) NSArray *music;

- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate;
- (NSDate *)dateByAddingYears:(NSInteger)numberOfYears toDate:(NSDate *)inputDate;

@end

@implementation SportsViewController

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

//make HTTP call
NSString* searchCall = [NSString stringWithFormat:@"http://www.google.com/calendar/feeds/kao1d80fd2u5kh7268caop11o4%%40group.calendar.google.com/public/full?alt=json"];
NSString* searchCall2 = [NSString stringWithFormat:@"http://www.google.com/calendar/feeds/3qag5m8iad46mtvsnnqbtrcjjg%%40group.calendar.google.com/public/full?alt=json"];

[JSONHTTPClient getJSONFromURLWithString: searchCall
completion:^(NSDictionary *json, JSONModelError *err) {

//got JSON back
NSLog(@"Got Sports JSON from web: %@", json);

if (err) {
[[[UIAlertView alloc] initWithTitle:@"Error"
message:[err localizedDescription]
delegate:nil
cancelButtonTitle:@"Close"
otherButtonTitles: nil] show];
return;
}

//initialize the models
_events = [CalendarModel arrayOfModelsFromDictionaries:
json[@"feed"][@"entry"]
];

if (_events) NSLog(@"Loaded successfully sports models");

//show the Events
[_events addObjectsFromArray:_music];
NSLog(@"%@", _events);
[self.tableView reloadData];

}];

[JSONHTTPClient getJSONFromURLWithString: searchCall2
completion:^(NSDictionary *json2, JSONModelError *err2) {

//got JSON back
NSLog(@"Got Music JSON from web: %@", json2);

if (err2) {
[[[UIAlertView alloc] initWithTitle:@"Error"
message:[err2 localizedDescription]
delegate:nil
cancelButtonTitle:@"Close"
otherButtonTitles: nil] show];
return;
}

//initialize the models
_music = [CalendarModel arrayOfModelsFromDictionaries:
json2[@"feed"][@"entry"]
];

if (_music) NSLog(@"Loaded successfully music models");
[_events addObjectsFromArray:_music];
//show the Events
[self.tableView reloadData];

}];
//[events addObjectsFromArray:music];
[self.tableView reloadData];

}
;

-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}



- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark - table methods
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _events.count;
}

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

CalendarModel* event = _events[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;
}
@end

所以基本上我需要排序的所有数据都驻留在 _events 数组中。我只是不知道如何按日期将其分类。 startTime 和 endTime 是 NSString 的原因是,这就是我调用 Google 上的共享日历返回的内容

最佳答案

首先对所有事件进行分组 - 你必须注意变量范围(我在本地使用天数和 groupedEvents,但你必须将它们声明为 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];
}

章节标题:

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

我只触及了您的 cellForRow 中的前两行 - 您可以根据需要修改其余部分以进行显示/格式化:

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

关于ios - 从事件数组中按日期将 UITableView 分类为多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15657211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com