简体   繁体   English

使用带有重复规则iOS的dueDate设置提醒

[英]Setting Reminder with a dueDate with Recurrence Rule iOS

Question : How do I properly set my reminder due date since I have a recurrence rule? 问题 :由于我有重复规则,如何正确设置提醒到期日期?

Here is what the reminder object looks like: 提醒对象如下所示:

EKReminder <0x1700cf490> {title = Dickens's CANINE GOLD WELLNESS doses[1.00]; **dueDate = (null)**; **completionDate = (null)**; priority = 0; calendarItemIdentifier = D1D99FEA-2BFA-4DB1-9D86-7FB26246B50A; alarms = (
    "EKAlarm <0x1780a9420> {triggerInterval = -79200.000000}"
)}

The error I am getting is: 我得到的错误是:

Reminder Error=[A repeating reminder must have a due date.]

You can see in the code that I am fooling around with NSDateComponents as a solution since startDateComponents which I just set the month/day/year and local timezone of the reminder which will produce an all day reminder, which in this case is fine. 您可以在代码中看到我正在使用NSDateComponents作为解决方案,因为startDateComponents我只是设置了提醒的月份/日期/年份和本地时区,因此会产生一整天的提醒,在这种情况下很好。 I will probably move the date components and setting of the due date inside the recurrence section when it is done. 完成后,我可能会在重复部分中移动日期组件和到期日期的设置。

Here is my code: 这是我的代码:

-(void)setReminders:(NSString *)reminderText
            andDate:(NSString *)reminderdate
         andPetName:(NSString*)petName
            andDose:(NSNumber *)dose {

    EKEventStore *store = [[EKEventStore alloc] init];

    NSDate * reminderNewDate = [self getDateFromString:reminderdate];
    petName = [ConfigOps readProperty:kConfigOpsPetKey];

    NSString *reminderTitle = [NSString stringWithFormat:@"%@'s %@", petName, reminderText];
    NSUInteger doseCount = 0;

    if ([dose integerValue] != 0 || dose != nil) {
        doseCount = [dose integerValue];
    }
    else{
        doseCount = 0;//NOTE: looks like purchases will have doses not reminders so set to 0 for now.
    }

    [store requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {
        // access code here
        EKReminder *new_reminder = [EKReminder reminderWithEventStore:store];
        new_reminder.title = reminderTitle;

        new_reminder.calendar = store.defaultCalendarForNewEvents;

        //get the date components
        NSDateComponents *comp = [[NSDateComponents alloc]init];
        NSCalendar *gregorian = [[NSCalendar alloc]
                                 initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *weekdayComponents =
        [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit |
                               NSWeekdayCalendarUnit) fromDate:reminderNewDate];
        NSInteger day = [weekdayComponents day];
        NSInteger month = [weekdayComponents month];
        //NSInteger weekday = [weekdayComponents weekday];//future reference
        NSInteger year = [weekdayComponents yearForWeekOfYear];
        //Month is dose+month = end of reccurence
        month = month + doseCount;
        [comp setYear:year];
        [comp setMonth:month];
        [comp setDay:day];
        NSDate *date = [gregorian dateFromComponents:comp];

        NSTimeZone *myNSTimeZone = gregorian.timeZone;
        NSDateComponents *start = new_reminder.startDateComponents;
        start.timeZone = myNSTimeZone;

        start.month = [weekdayComponents month];
        start.day = [weekdayComponents day];
        start.year =  [weekdayComponents yearForWeekOfYear];

        new_reminder.startDateComponents = start;
        new_reminder.dueDateComponents = start;
        new_reminder.completed = NO;

        //Create alarm 22 hours before
        double alarmAmountInSeconds = 60.0*60.0*22.0;
        EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:(-1.0*alarmAmountInSeconds)];

        [new_reminder addAlarm:alarm];
        //new_reminder.alarms = [NSArray arrayWithObject:alarm];

        //create nice text for note.
        //Hey there! petName needs remindertext from your friendly clinic, clinicName!
        new_reminder.notes = reminderText;

        if (doseCount != 0) {

            EKRecurrenceRule *recurranceRule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyMonthly
                                                                                            interval:1
                                                                                                 end:[EKRecurrenceEnd recurrenceEndWithOccurrenceCount:doseCount]
                                                ];
            new_reminder.calendar = [store defaultCalendarForNewReminders];
            [new_reminder addRecurrenceRule:recurranceRule];
        }

        NSError *er;
        //EKEventEditViewController
        BOOL success = [store saveReminder:new_reminder commit:YES error:&er];

        if (success) {
            // Handle here
             NSString *alertMessage = [NSString stringWithFormat:@"Reminder Created for\n%@", reminderTitle];
             NSString *alertTitle = @"Please check your Reminders";
            UIAlertView *alertR = [[UIAlertView alloc]initWithTitle: alertTitle
                                                            message: alertMessage
                                                           delegate: self
                                                  cancelButtonTitle:nil
                                                  otherButtonTitles:@"OK",nil];
             [alertR show];

        }
        else{
            //log error
            NSLog(@" Reminder Error=[%@]", [er localizedDescription]);
            //log to error table in database &inform Flurry?
        }
    }];
}

The method works if there is no recurrence set since it doesn't require a start date/due date. 如果没有重复设置,则该方法有效,因为它不需要开始日期/到期日期。

For those looking for Swift version: 对于那些寻找Swift版本的人:

func editReminder(r: EKReminder) -> Bool {
    if(r.recurrenceRules.count > 0 && r.dueDateComponents == nil) {
        let startDate = NSDate()
        let dueDate: NSDate = NSDate(timeIntervalSinceNow: 31536000) // 1 year from now
        let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
        let unitFlags = NSCalendarUnit(UInt.max)
        r.dueDateComponents = gregorian?.components(unitFlags, fromDate: dueDate)
    }
    var error: NSError?
    return eventStore.saveReminder(r, commit: true, error: &error)
}

After some fixing of the date (I found was returning nil), I found that I have to set and end recurrence rule when adding a dose amount. 确定日期后(我发现返回零),我发现添加剂量时必须设置并结束重复规则。

Here is the code which gets rid of the error (which is pretty funny of Apple to have - kudos Apple!). 这是摆脱错误的代码(对于Apple来说,这很有趣-称赞Apple!)。

if (doseCount != 0) {

            EKRecurrenceRule *recurranceRule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyMonthly
                                                                                            interval:1
                                                                                                 end:[EKRecurrenceEnd recurrenceEndWithOccurrenceCount:doseCount]
                                                ];
            new_reminder.calendar = [store defaultCalendarForNewReminders];

            //FIX for : recuurence end - Reminder Error = [A repeating reminder must have a due date.]
            EKRecurrenceEnd *endRec = [EKRecurrenceEnd recurrenceEndWithEndDate:date];
            EKRecurrenceRule *recur = [[EKRecurrenceRule alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyDaily interval:   1 end:endRec];

            unsigned unitFlags= NSYearCalendarUnit|NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit |NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit;

            NSDateComponents *dailyComponents=[gregorian components:unitFlags fromDate:date];
            [new_reminder setDueDateComponents:dailyComponents];
            [new_reminder addRecurrenceRule:recur];

            //add it.
            [new_reminder addRecurrenceRule:recurranceRule];

        }

Hope this helps someone get through this. 希望这可以帮助某人解决这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM