iOS日历集成到app

时间:2012-05-01 19:09:15

标签: ios calendar

我有一个应用程序所以我只是在我的应用程序中添加了一些事件或其余部分(足球比赛,电影)特定的日期和时间。 这个添加事件我也想在iphone日历中显示。

感谢和问候。

4 个答案:

答案 0 :(得分:4)

你签出了EventKit吗?

答案 1 :(得分:1)

您可以使用简单的JTCalender

首先,oyu必须包含项目的JT Calender框架

您必须在UIViewController中创建两个视图:

第一个视图是JTCalendarMenuView,它代表具有月份名称的部分。此视图是可选的。 第二个视图是JTHorizo​​ntalCalendarView或JTVerticalCalendarView,它代表日历本身。 你的UIViewController必须实现JTCalendarDelegate,所有方法都是可选的。

.h文件中的

#import <UIKit/UIKit.h>
#import "CustomTableViewCell.h"

#import "JTCalendar/JTCalendar.h"



@interface CalendarViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,JTCalendarDelegate>

@property (strong, nonatomic)  JTCalendarMenuView *calendarMenuView;
@property (strong, nonatomic) JTHorizontalCalendarView *calendarContentView;

@property (strong, nonatomic) JTCalendarManager *calendarManager;

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *calendarContentViewHeight;


@end


.m file
------------

#import "CalendarViewController.h"

#import "ApptWindowView.h"
#import "SVProgressHUD.h"

@interface CalendarViewController () < UITextFieldDelegate>{
    NSMutableDictionary *dayDateDict;
    NSMutableArray*jsonDate,*dateAr1,*dateAr2;
    UITableView *appointTableView;
    CGSize screenRect;
    NSString *dateAfterString;

    int fontSize,headerBtnfont,height;
    NSDateFormatter *dateFormat1 ;
    NSString*cmpDay;
    int count;
    NSString * clickedDate;
    NSString *day ;




     NSMutableDictionary *_eventsByDate;

        NSDate *_todayDate;
        NSDate *_minDate;
        NSDate *_maxDate;

        NSDate *_dateSelected;

  UIActivityIndicatorView *activityIndicator;
    int i;
}




@end

@implementation CalendarViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

        i=0;
    dayDateDict=[[NSMutableDictionary alloc]init];
    dateAr1=[[NSMutableArray alloc]init];
    dateAr2=[[NSMutableArray alloc]init];
    screenRect=[[UIScreen mainScreen]bounds].size;





    //Create header here
    self.view.backgroundColor=[UIColor colorWithRed:(CGFloat)233/255 green:(CGFloat)239/255 blue:(CGFloat)239/255 alpha:1];
    UIView * headerView =[[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 55)];
    headerView.backgroundColor =[UIColor whiteColor];
    [self.view addSubview:headerView];

    UILabel * titleLable =[[UILabel alloc]initWithFrame:CGRectMake(60, 25, [UIScreen mainScreen].bounds.size.width-120, 25)];
    titleLable.text =@"CHOOSE APPOINTMENT";
    titleLable.textAlignment = NSTextAlignmentCenter;
    titleLable.font =[UIFont systemFontOfSize:12];
    [headerView addSubview:titleLable];

    UIButton *backButton =  [UIButton buttonWithType:UIButtonTypeCustom];
    [backButton setImage:[UIImage imageNamed:@"back_btn.png"] forState:UIControlStateNormal];
    [backButton setFrame:CGRectMake(15, 30, 45, 15)];
    [backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
    [headerView addSubview:backButton];

    UIButton *nextButton =  [UIButton buttonWithType:UIButtonTypeCustom];
    [nextButton setImage:[UIImage imageNamed:@"next_btn.png"] forState:UIControlStateNormal];
    [nextButton setFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-60, 30, 45, 15)];
    [nextButton addTarget:self action:@selector(continueAction) forControlEvents:UIControlEventTouchUpInside];
    [headerView addSubview:nextButton];


    [self activityAction];
    dispatch_async(dispatch_get_global_queue(0, 0),^{



        dispatch_async(dispatch_get_main_queue(),^{
            // [self createUI];
            [self fetchSchedule];

            _calendarManager = [JTCalendarManager new];
            _calendarManager.delegate = self;
            [self createMinAndMaxDate];
     _calendarContentView=[JTHorizontalCalendarView new];         
            _calendarContentView.frame = CGRectMake(20, 100,[UIScreen mainScreen].bounds.size.width-40 , [UIScreen mainScreen].bounds.size.width-40);
            _calendarContentView.backgroundColor=[UIColor whiteColor];

            [_calendarManager setContentView:_calendarContentView];
            [self.view addSubview:_calendarContentView];


            _calendarMenuView=[JTCalendarMenuView new];
            _calendarMenuView.frame=CGRectMake(20, 55,[UIScreen mainScreen].bounds.size.width-40 ,50);
            _calendarMenuView.backgroundColor=[UIColor clearColor];
            [self.view addSubview:_calendarMenuView];
            [_calendarManager setMenuView:_calendarMenuView];
            [_calendarManager setDate:[NSDate date]];


            [activityIndicator stopAnimating];
        });


    });

    [self createUI];

}
-(void)continueAction{
    ApptWindowView *apptWindow=[[ApptWindowView alloc]init];
    [self.navigationController pushViewController:apptWindow animated:YES];
}
- (UIView<JTCalendarDay> *)calendarBuildDayView:(JTCalendarManager *)calendar
{
    JTCalendarDayView *view = [JTCalendarDayView new];
    view.textLabel.font = [UIFont fontWithName:@"Avenir-Light" size:13];
    view.textLabel.textColor = [UIColor blackColor];

    return view;
}




    NSError *error;   NSURLResponse * urlResponse;


    NSURL * url =[NSURL URLWithString:fetchScheduleService];

    NSMutableURLRequest  * request =[[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:50];



    NSString * body =[NSString stringWithFormat:@"departmentId=%d",[SingletonClass sharedSingleton].deptId ];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    NSData * data =[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
    if (!data) {
          [SVProgressHUD dismiss];
        return;
    }
    id jsonResponse =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

    NSLog(@"schedule jason---->%@",jsonResponse);




    if ([[jsonResponse objectForKey:@"code"] isEqualToNumber:[NSNumber numberWithInt:200]]) {



        jsonDate=[jsonResponse objectForKey:@"data"];


        [self convertTimeStamp];

    }
        //dispatch_async(dispatch_get_main_queue(),^{
            // [SVProgressHUD dismiss];
            //[self createUI];
      //  });

//    });

}

#pragma mark-Create UI/Table View
-(void)createUI{
    appointTableView = [[UITableView alloc]init];
    appointTableView.frame =  CGRectMake(10, 100+screenRect.width-40+10, screenRect.width-20, screenRect.height-( 100+screenRect.width-40+10));
    appointTableView.delegate = self;
    appointTableView.dataSource = self;
    appointTableView.backgroundColor =[UIColor clearColor];
    appointTableView.showsVerticalScrollIndicator = NO;
    appointTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [self.view addSubview:appointTableView];
}



-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[dayDateDict objectForKey:clickedDate] count];
}

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

    CustomTableViewCell * cell =(CustomTableViewCell*) [tableView cellForRowAtIndexPath:indexPath];
    if (!cell) {
        cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"calender"];
        cell.backgroundColor = [UIColor clearColor];
    }
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;


    [dateFormat1 setDateFormat:@"HH:mm"];

    NSDate * aptTime =[dateFormat1 dateFromString:[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row] ];
    NSDate *dateAfter=[aptTime dateByAddingTimeInterval:(1800) ];
   dateAfterString =[dateFormat1 stringFromDate:dateAfter];
    NSString *dis=[NSString stringWithFormat:@"%@-%@",[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row],dateAfterString];





    cell.appointmentTime.text =dis;



    return  cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return  100;
    }
    return 60;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    ApptWindowView *apptWindow=[[ApptWindowView alloc]init];
    [self.navigationController pushViewController:apptWindow animated:YES];


    NSLog(@"clicked date-->%@",[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row]);


    NSDate * aptTime =[dateFormat1 dateFromString:[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row] ];
    NSDate *dateAfter=[aptTime dateByAddingTimeInterval:(1800) ];
    dateAfterString =[dateFormat1 stringFromDate:dateAfter];


    NSString *dis=[NSString stringWithFormat:@"%@ to %@ on %@",[[dayDateDict objectForKey:clickedDate]objectAtIndex:indexPath.row],dateAfterString,day];


    [[NSUserDefaults standardUserDefaults]setObject:dis forKey:@"appointmentTime"];
    [[NSUserDefaults standardUserDefaults]synchronize];



}
#pragma mark-convert timeStamp to date
-(void)convertTimeStamp{




    for( NSString*valueForDate in jsonDate){



 NSTimeInterval timeSec=[valueForDate doubleValue];
 NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeSec];

 NSLog(@"\ndate are-->%@",date);

 [self separateDate:date];
    }



 }


 #pragma mark-separate date and Time
 -(void)separateDate:(NSDate*)date1{

dateFormat1 = [[NSDateFormatter alloc] init];


 [dateFormat1 setDateFormat:@"HH:mm"];

 NSString * resultTime =[dateFormat1 stringFromDate:date1];
 NSLog(@"date is-->%@",resultTime);

 [dateFormat1 setDateFormat:@"dd-MM-YYYY"];
 NSString *resultDay=[dateFormat1 stringFromDate:date1];
 NSLog(@"day is-->%@",resultDay);



          if([cmpDay isEqual:resultDay] || cmpDay==nil){

              if(count!=1){
               [dateAr1 addObject:resultTime];
              }
              if(count==1){

                  [dateAr2 addObject:resultTime];
              }



     }
          else{

              count=1;

               dateAr2=[[NSMutableArray alloc]init];
               [dateAr2 addObject:resultTime];
          }

     cmpDay=resultDay;


     if(count!=1){
     [dayDateDict setObject:dateAr1 forKey:resultDay];
     }
     else{
     [dayDateDict setObject:dateAr2 forKey:resultDay];
     }

     NSLog(@"dictionary--->%@",dayDateDict);




 }
#pragma mark - Buttons callback

- (IBAction)didGoTodayTouch
{
    [_calendarManager setDate:_todayDate];
}

- (IBAction)didChangeModeTouch
{
    _calendarManager.settings.weekModeEnabled = !_calendarManager.settings.weekModeEnabled;
    [_calendarManager reload];

    CGFloat newHeight = 300;
    if(_calendarManager.settings.weekModeEnabled){
        newHeight = 85.;
    }

    self.calendarContentViewHeight.constant = newHeight;
    [self.view layoutIfNeeded];
}

#pragma mark - CalendarManager delegate

// Exemple of implementation of prepareDayView method
// Used to customize the appearance of dayView
- (void)calendar:(JTCalendarManager *)calendar prepareDayView:(JTCalendarDayView *)dayView
{
    // Today
    if([_calendarManager.dateHelper date:[NSDate date] isTheSameDayThan:dayView.date]){
        dayView.circleView.hidden = NO;
        dayView.circleView.backgroundColor = [UIColor blueColor];
        dayView.dotView.backgroundColor = [UIColor whiteColor];
        dayView.textLabel.textColor = [UIColor whiteColor];
    }
    // Selected date
    else if(_dateSelected && [_calendarManager.dateHelper date:_dateSelected isTheSameDayThan:dayView.date]){
        dayView.circleView.hidden = NO;
        dayView.circleView.backgroundColor = [UIColor redColor];
        dayView.dotView.backgroundColor = [UIColor whiteColor];
        dayView.textLabel.textColor = [UIColor whiteColor];
    }
    // Other month
    else if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){
        dayView.circleView.hidden = YES;
        dayView.dotView.backgroundColor = [UIColor redColor];
        dayView.textLabel.textColor = [UIColor lightGrayColor];
    }
    // Another day of the current month
    else{
        dayView.circleView.hidden = YES;
        dayView.dotView.backgroundColor = [UIColor redColor];
        dayView.textLabel.textColor = [UIColor blackColor];
    }

    if([self haveEventForDay:dayView.date]){
        dayView.dotView.hidden = NO;
    }
    else{
        dayView.dotView.hidden = YES;
    }
}

- (void)calendar:(JTCalendarManager *)calendar didTouchDayView:(JTCalendarDayView *)dayView
{
    _dateSelected = dayView.date  ;

    NSLog(@"orginal Clicked day-->%@",dayView.date);



    NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];

            [dateFormat2 setDateFormat:@"dd-MM-YYYY"];

            clickedDate =[dateFormat2 stringFromDate:_dateSelected];

            NSLog(@"Selected date===>%@",clickedDate);


            NSString* s= [dayDateDict objectForKey:clickedDate];
            NSLog(@"time is===>%@",s);

            [dateFormat2 setDateFormat:@"EEE, MMM dd "];

           day =[dateFormat2 stringFromDate:_dateSelected];


            NSLog(@"Selected day===>%@",day);



    // Animation for the circleView
    dayView.circleView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.1, 0.1);
    [UIView transitionWithView:dayView
                      duration:.3
                       options:0
                    animations:^{
                        dayView.circleView.transform = CGAffineTransformIdentity;
                        [_calendarManager reload];
                    } completion:nil];


    // Load the previous or next page if touch a day from another month

    if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){
        if([_calendarContentView.date compare:dayView.date] == NSOrderedAscending){
            [_calendarContentView loadNextPageWithAnimation];
        }
        else{
            [_calendarContentView loadPreviousPageWithAnimation];
        }
    }

    [appointTableView reloadData];
}

#pragma mark - CalendarManager delegate - Page mangement

// Used to limit the date for the calendar, optional
- (BOOL)calendar:(JTCalendarManager *)calendar canDisplayPageWithDate:(NSDate *)date
{
    return [_calendarManager.dateHelper date:date isEqualOrAfter:_minDate andEqualOrBefore:_maxDate];
}

- (void)calendarDidLoadNextPage:(JTCalendarManager *)calendar
{
    //    NSLog(@"Next page loaded");
}

- (void)calendarDidLoadPreviousPage:(JTCalendarManager *)calendar
{
    //    NSLog(@"Previous page loaded");
}

#pragma mark - Fake data

- (void)createMinAndMaxDate
{
    _todayDate = [NSDate date];

    // Min date will be 2 month before today
    _minDate = [_calendarManager.dateHelper addToDate:_todayDate months:-3];

    // Max date will be 2 month after today
    _maxDate = [_calendarManager.dateHelper addToDate:_todayDate months:3];
}


- (BOOL)haveEventForDay:(NSDate *)date
{
    if(i>=[dayDateDict allKeys].count){
        i=0;
    }
    NSDateFormatter *dateFormatter;

    dateFormatter = [[NSDateFormatter alloc]init];
     [dateFormatter setDateFormat:@"dd-MM-YYYY"];



    NSString *key = [dateFormatter stringFromDate:date];



    while(i<[dayDateDict allKeys].count){
    if([key isEqual:[[dayDateDict allKeys]objectAtIndex:i]]){
            i++;
            return YES;
    }

        else
            return NO;

    }

        return NO;






}


#pragma mark-Activity Indicator
-(void)activityAction{
    CGSize windowSize =[UIScreen  mainScreen].bounds.size;
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityIndicator.frame = CGRectMake(windowSize.width/2-20, windowSize.height/2-55,40 ,40);
    activityIndicator.color = [UIColor blackColor];
    activityIndicator.alpha = 1;
    [self.view addSubview:activityIndicator];
    //[self placeSearchbaseId];

    [activityIndicator startAnimating];


}


@end

我从json获取时间戳格式并转换为本地时间

的json数据

然后我在日历中为它创建一个事件

答案 2 :(得分:0)

您有第三方应用程序,如Kal,支持日历集成。检查此链接: Kal Calendar

希望有所帮助

答案 3 :(得分:0)