导入.ics文件并在Calendar或UITableView中显示

时间:2014-01-09 17:00:07

标签: ios iphone objective-c uitableview calendar

我从某个网址中检索.ics文件。我想在我自己的应用程序的日历和/或列表视图中显示此文件的信息。我看了一下iCal4Objc(“https://github.com/cybergarage/iCal4ObjC”)并解析了这样的信息:

   -(NSMutableArray *)getPlanFromURL:(NSURL *)url {
    NSMutableArray *planEntries = [[NSMutableArray alloc]init];

    NSString *storePath = [self loadICSAndReturnPathFromURL:url];

    CGICalendar *parserCalendar = [[CGICalendar alloc]initWithPath:storePath];
    for(CGICalendarObject *planObject in [parserCalendar objects]) {
        for(CGICalendarComponent *component in [planObject components]) {
            for (CGICalendarProperty *icalProp in [component properties]) {
                NSString *icalPropName = [icalProp name];
                NSLog(@"%@",icalPropName);
                if([icalPropName isEqualToString:SUMMARY]) {
                    [self.summaryArray addObject:[icalProp value]];
                }

                else if([icalPropName isEqualToString:LOCATION]) {
                    [self.locationArray addObject:[icalProp value]];
                }

                else if([icalPropName isEqualToString:CATEGORIES]) {
                    [self.categoryArray addObject:[icalProp value]];

                }

                else if([icalPropName isEqualToString:DTSTART]) {
                    [self.startArray addObject:[icalProp dateValue]];

                }

                else if([icalPropName isEqualToString:DTEND]) {
                    [self.endArray addObject:[icalProp dateValue]];

                }
            }
        }

    }

    for(int i = 0;i<[self.summaryArray count];i++) {
        DECalEntry *entry = [[DECalEntry alloc]init];
        entry.summary = [self.summaryArray objectAtIndex:i];
        entry.roomInformation = [self.locationArray objectAtIndex:i];
        entry.category = [self.categoryArray objectAtIndex:i];
        entry.startDate = [self.startArray objectAtIndex:i];
        entry.endDate = [self.endArray objectAtIndex:i];

        if ([entry.category isEqualToString:@"Prüfung"]) {
            entry.isExam = true;
        }
        else entry.isExam = false;

        [planEntries addObject:entry];

    }

    return planEntries;

}

-(NSString *)loadICSAndReturnPathFromURL:(NSURL *)url {
    NSURLRequest * urlRequest = [NSURLRequest requestWithURL:url];
    NSURLResponse * response = nil;
    NSError * error = nil;
    NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                          returningResponse:&response
                                                      error:&error];

    if (error == nil)
    {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *storePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"planData.ics"];

        [data writeToFile:storePath atomically:YES];
        return storePath;

    }
    NSLog(@"Error: %@",[error localizedDescription]);

    return nil;
}

因为这不是很干净而且实现UITableView和日历视图以说明解析数据会很痛苦我问我是否存在一个框架,你们中的一个人知道哪些已经可以处理.ics文件和节目他们因此。

如果你有一个想法,如何解决这个问题不那么复杂和/或用更少的努力,我将非常感激。

另请查看我的评论。目前根本没有考虑rrule财产。但这非常重要,因为它告诉我一个事件是否重复,直到它重复等等......

2 个答案:

答案 0 :(得分:2)

没关系我通过解析rrule属性就像我用其他属性做的那样自己工作,并构造了一个方法,通过遵循该属性包含的信息创建我需要的正确数量的对象。嗯,我只是认为这是唯一的方法,因为显然没有导入和解析.ics文件的框架。当我完成我的项目时,我可能会为那些可能面对这一天的人提供一个机会。

答案 1 :(得分:1)

据我所知,Apple没有提供显示.ics文件的框架或控件,但是一旦构建了EKEvent,就会有:

https://developer.apple.com/library/ios/documentation/EventKitUI/Reference/EKEventEditViewControllerClassRef/Reference/Reference.html#//apple_ref/doc/uid/TP40009571

具体来说,您想看一下EventKitUI.framework。