Pergunta

i downloaded DSLCalender from https://github.com/PeteC/DSLCalendarView i want to mark some dates at the time of loading program.

ViewController.m

-(void)SelectStartDateAndEndDate
{

    NSDate *now = [NSDate date];

    // Creates an object representing the Gregorian calendar
    NSCalendar *calendar1 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    // Sets the calendar object with an object representing the time zone specified in System Preferences
    [calendar1 setTimeZone:[NSTimeZone systemTimeZone]];

    // Calls the components:fromDate: method on the calendar object, passing in the date object created in line 2. This call returns an object containing the hour, minute, and second components of the date object
    NSDateComponents *dc = [calendar1 components:( NSCalendarCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:now];

    // Logs the current hour, minute, and second to the console
    NSLog(@"The time is %d:%d:%d:%d:%d:%d",[dc day],[dc month],[dc year], [dc hour], [dc minute], [dc second]);



    // Creates an object representing the Gregorian calendar
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setTimeZone:[NSTimeZone systemTimeZone]];

    //StartDate
     NSDateComponents *startDateComps = [[NSDateComponents alloc] init];
    [startDateComps setWeekday:0];
    [startDateComps setDay:4];
    [startDateComps setMonth:5];
    [startDateComps setYear:2014];

    NSDate *startDate = [calendar dateFromComponents:startDateComps];

    NSDateComponents *useStartDateComps = [calendar components:( NSCalendarCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:startDate];

    NSLog(@"The time is %d:%d:%d",[useStartDateComps day],[useStartDateComps month],[useStartDateComps year]);
    //EndDate

    NSDateComponents *endDateComps = [[NSDateComponents alloc] init];
    [endDateComps setWeekday:0];
    [endDateComps setDay:14];
    [endDateComps setMonth:5];
    [endDateComps setYear:2014];

    NSDate *endDate = [calendar dateFromComponents:endDateComps];

    NSDateComponents *useEndDateComps = [calendar components:( NSCalendarCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:endDate];

    DSLCalendarRange *newRange = self.selectedRange;

    newRange = [self.selectedRange initWithStartDay:useStartDateComps endDay:useEndDateComps];
    NSLog(@"New Range : %@",newRange);

    [self.mCalenderMonth updateDaySelectionStatesForRange: newRange];

}

in updateDaySelectionStatesForRange, self.dayView show null value so it is not working .but in touchesbegan it shows correct value.

Foi útil?

Solução

I have same issue. but made some modification and it works.

First you have to replace code method. File. DSLCalendarRange.m

// Designated initialiser
- (id)initWithStartDay:(NSDateComponents *)start endDay:(NSDateComponents *)end {
    NSParameterAssert(start);
    NSParameterAssert(end);

    self = [super init];
    if (self != nil) {
        // Initialise properties
        _startDay = [start copy];

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyyMMdd"];

        NSString *stringFromDate = [NSString stringWithFormat:@"%i%2i%2i",start.year,start.month,start.day];

        stringFromDate = [stringFromDate stringByReplacingOccurrencesOfString:@" " withString:@"0"];


        _startDate = [formatter dateFromString:stringFromDate];

        _endDay = [end copy];


        stringFromDate = [NSString stringWithFormat:@"%i%2i%2i",end.year,end.month,end.day];

        stringFromDate = [stringFromDate stringByReplacingOccurrencesOfString:@" " withString:@"0"];

        _endDate = [formatter dateFromString:stringFromDate];

      //  _endDate = [end date];

    }

    return self;
}

And also in file. DSLCalendarMonthView.m

- (void)updateDaySelectionStatesForRange:(DSLCalendarRange*)range {
    for (DSLCalendarDayView *dayView in self.dayViews) {

       if ([range containsDate:dayView.dayAsDate])
           {
            BOOL isStartOfRange = (range.startDay.day == dayView.day.day &&
                                  range.startDay.month == dayView.day.month &&
                                   range.startDay.year == dayView.day.year); //[range.startDay isEqual:dayView.day];
               BOOL isEndOfRange = (range.endDay.day == dayView.day.day &&
                                    range.endDay.month == dayView.day.month &&
                                    range.endDay.year == dayView.day.year); //[range.endDay isEqual:dayView.day];

            if (isStartOfRange && isEndOfRange) {
                dayView.selectionState = DSLCalendarDayViewWholeSelection;
            }
            else if (isStartOfRange) {
                dayView.selectionState = DSLCalendarDayViewStartOfSelection;
            }
            else if (isEndOfRange) {
                dayView.selectionState = DSLCalendarDayViewEndOfSelection;
            }
            else {
                dayView.selectionState = DSLCalendarDayViewWithinSelection;
            }
            [dayView setNeedsDisplay];
        }
        else {
            dayView.selectionState = DSLCalendarDayViewNotSelected;
        }
    }
}

And Then you can use it like this .

 NSDateComponents *startDateComps = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:_checkIn];
;

    NSDateComponents *endDateComps =  [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:_checkOut];

    DSLCalendarRange *newRange=[[DSLCalendarRange alloc] initWithStartDay:startDateComps endDay:endDateComps];


    [self.calendarView setSelectedRange:newRange];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top