Проверка повторяющихся событий без получения всех событий в хранилище событий в IOS

Я добавляю массив событий в календарь IOS. Поскольку это должно происходить при нажатии кнопки. Делая это, все события добавляются снова и снова. Итак, чтобы преодолеть это, я использовал NSPredicate для получения всех событий и выполнения проверки, например ниже

NSDate *edate=[formatter dateFromString:startDateString];
NSDate *fdate=[formatter dateFromString:endDateString];


NSLog(@"Start Date is %@",edate);
NSLog(@"End Date is %@",fdate);

event1.startDate =edate;
event1.endDate=fdate;


NSArray *caleandarsArray = [[NSArray alloc] init];
caleandarsArray = [eventStore calendars] ;

NSPredicate *predicateForEvents = [eventStore predicateForEventsWithStartDate:edate endDate:fdate calendars:caleandarsArray]; // nil will search through all calendars


 NSArray *eventsOnDate = [eventStore eventsMatchingPredicate:predicateForEvents];

 NSLog(@"Events on holday date is %@",eventsOnDate);


 BOOL eventExists = NO;

 for (EKEvent *eventToCheck in eventsOnDate)
 {

   NSLog(@" eventToCheck title is %@",eventToCheck.title);
    NSLog(@" myTripsArray title is %@",[myTripsArray objectAtIndex:i]);

     if ([eventToCheck.title isEqualToString:[myTripsArray objectAtIndex:i]])
     {
          eventExists = YES;
         NSLog(@"Event already existed");

     }
   }



   if (eventExists == NO)
      {

         [event1 setTimeZone:[NSTimeZone systemTimeZone]];
         [event1 setCalendar:[eventStore defaultCalendarForNewEvents]];
         NSError *err;
         if(err)
         {
            NSLog(@"Error occured");

         }
          else
         {
            NSLog(@"Error not occured");

         }
                 [eventStore saveEvent:event1 span:EKSpanThisEvent error:&err];
       }

 }

По приведенному выше коду я получаю только события дня рождения, а не какие-либо другие существующие события. Как получить все события из календаря.

Пожалуйста, помогите мне, где я ошибся.


person iSwaroop    schedule 21.10.2013    source источник


Ответы (2)


Я решил это, используя приведенный ниже код

-(IBAction)calenderButtonAction:(id)sender
{

eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    // the selector is available, so we must be on iOS 6 or newer
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (error)
            {
                // display error message here
                NSLog(@"error");


            }
            else if (!granted)
            {
                // display access denied error message here
                NSLog(@"not granted");
            }
            else
            {
                // access granted
                NSLog(@" granted");
                [self addingDetailsToCalender];

                // ***** do the important stuff here *****
            }
        });
    }];
}
}

Добавление событий в календарь с игнорированием дубликатов

 -(void)addingDetailsToCalender
 {

EKEvent *event1  = [EKEvent eventWithEventStore:eventStore];
event1.location=@"Hyderabad";
event1.title=@"Sample test Satya ";

event1.startDate =[NSDate date];
// event1.endDate=[NSDate dateWithTimeIntervalSinceNow:86400];;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [NSDateComponents new];
comps.day = 7;
NSDate *sevenDays = [calendar dateByAddingComponents:comps toDate:[NSDate date] options:0];

NSLog(@"Seven days date is %@",sevenDays);
event1.endDate=sevenDays;

  NSPredicate *predicateForEvents = [eventStore predicateForEventsWithStartDate:[NSDate date] endDate:[NSDate dateWithTimeIntervalSinceNow:10*365*86400] calendars:nil];

NSArray *eventsOnDate = [eventStore eventsMatchingPredicate:predicateForEvents];

NSLog(@"Events on holday date is %@",eventsOnDate);


 BOOL eventExists = NO;

for (EKEvent *eventToCheck in eventsOnDate)
{

    NSDateFormatter *dateFormatter=[[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSString *startDateStr=[NSString stringWithFormat:@"%@",
                            [dateFormatter stringFromDate:eventToCheck.startDate]];
    NSString *event1startDate= [NSString stringWithFormat:@"%@", [dateFormatter stringFromDate:event1.startDate]];
    NSLog(@"mystart date is %@",startDateStr);
    NSLog(@"my event start date is %@",event1startDate);


      if ([eventToCheck.title isEqualToString:event1.title] && [startDateStr isEqualToString:event1startDate])
     {
     eventExists = YES;
     NSLog(@"Event already existed");

    }
}


 if (eventExists == NO)
{

   [event1 setTimeZone:[NSTimeZone systemTimeZone]];
     [event1 setCalendar:[eventStore defaultCalendarForNewEvents]];
   NSError *err;
 if(err)
{
  NSLog(@"Error occured");

}
  else
 {

  NSLog(@"Error not occured");

}
 [eventStore saveEvent:event1 span:EKSpanThisEvent error:&err];

}

 }
person iSwaroop    schedule 22.10.2013

Насколько я проанализировал ваш код, вы должны установить ноль календаря в NSPredicate. Как это

NSPredicate *predicateForEvents = [eventStore predicateForEventsWithStartDate:edate endDate:fdate calendars:nil]; // nil will search through all calendars.

Надеюсь это поможет

person Surya Subenthiran    schedule 21.10.2013
comment
EKEvent {\ n \ t EKEvent ‹0xd2be4f0›\n {\ t title = \ t \ tLaxman Rajana \ День рождения U2019; \n\t местоположение = \t(null); \n\t calendar = \tEKCalendar ‹0xd2b7b80› {название = дни рождения; тип = день рождения; позволяет изменить = НЕТ; цвет = #8295AF;}; \n\t тревоги = \t\t(null); \n\t URL = \t\t\t(null); \n\t lastModified = (ноль); \n\t часовой пояс = \t(null) \n}; \n\t местоположение = \t(null); \n\t startDate = \t2013-10-20 18:30:00 ; \n\t endDate = \t\t2013-10-21 18:29:59 ; \n\t allDay = \t\t1; \n\t с плавающей запятой = \t1; \n\t повторение = \tEKRecurrenceRule ‹0x12a36f90› RRULE FREQ=YEARLY;INTERVAL=1; \n\t участников = \t(null) \n}; - person iSwaroop; 21.10.2013