iOS: библиотека календаря Tapku - позволяет выбрать несколько дат на текущий месяц - PullRequest
1 голос
/ 13 марта 2012

Я использую библиотеку Tapku для реализации календаря.Я мог видеть, что есть способ добавить Маркеры для предварительно определенной даты начала и окончания, но я хочу позволить пользователям выбирать / отменять выбор любого числа дат только из текущего месяца и хотите создать событие для каждого действия.

Более того, я отключил функцию навигации по месяцам, вернув ноль для стрелок влево и вправо, чтобы отобразить только текущий месяц, но не смог удалить события за несколько предыдущих и следующих месяцев. Плитки дат, отображаемые в текущем месяце.Я все еще могу выбрать день 31-го предыдущего месяца, чтобы перейти к предыдущему месяцу или выбрать 1-й в следующем месяце, чтобы перейти к следующему месяцу.Могу ли я ограничить выбор даты только текущим месяцем?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

В TKCalendarMonthView есть имя метода

-(void) reactToTouch:(UITouch*)touch down:(BOOL)down 

, в этом методе комментируйте эту строку

[target performSelector:action withObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:day],[NSNumber numberWithInt:portion],nil]];

это не позволит вам изменить месяц.Вы можете сохранить всю выбранную дату в массиве и передать все значения в

- (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate 

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

2 голосов
/ 13 марта 2012

Касания обрабатываются в TKCalendarMonthView.m следующим способом:

- (void) reactToTouch:(UITouch*)touch down:(BOOL)down

посмотрите на блок в строке 563:

if(portion == 1)
{
    selectedDay = day;
    selectedPortion = portion;
    [target performSelector:action withObject:[NSArray arrayWithObject:[NSNumber numberWithInt:day]]];
}
else if(down)
{
    // this is the important part for you.
    // ignore it by adding a return here (or remove the following three lines)
    return;
    [target performSelector:action withObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:day],[NSNumber numberWithInt:portion],nil]];
    selectedDay = day;
    selectedPortion = portion;
}

Выбор / отмена выбора, возможно, не работает, как вы ожидаете. Это не похоже на setDateSelected и setDateDeselected .. вместо этого есть единственный UIImageView*, который представляет выбранное состояние. И это представление перемещается в текущую позицию. Вы можете искать self.selectedImageView в коде, чтобы увидеть, что происходит.

Так что не так просто ввести множественный выбор даты. Архитектура не построена для этого.

0 голосов
/ 06 мая 2013

Вы также можете попробовать этот код:

Вы можете сделать это, сначала введя даты в массив.код для этого:

- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
NSLog(@"selected Date IS - %@",inDate);

[myArray addObject:d];

for (id entry in myArray)
{

    if (inDate == nil && outDate == nil)
    {
        inDate = d;
        outDate = d;
    }
    if ([d compare:inDate] == NSOrderedAscending)
    {
        inDate = d;
    }
    if ([d compare:outDate] == NSOrderedDescending)
    {
        outDate = d;
    }

    d = nil;
}

}

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

 - (IBAction)goBtn:(id)sender
  {
NSLog(@"startDate is: %@",inDate);
NSLog(@"endDate is: %@",outDate);

[calendar reload];
inDate = nil;
outDate = nil;

}

}

Тогда в одном методе делегата вам просто нужно создать массив, содержащий все даты между этими двумя датами.Он будет вызван сразу после нажатия кнопки.Код для этого:

 - (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate {
//***********
NSMutableArray *tempData = [[NSMutableArray alloc] init];
NSDate *nextDate;
for ( nextDate = inDate ; [nextDate compare:outDate] < 0 ; nextDate = [nextDate addTimeInterval:24*60*60] ) {
    // use date
    NSLog(@"%@",nextDate);
    [tempData addObject:[NSString stringWithFormat:@"%@",nextDate]];
}
[tempData addObject:[NSString stringWithFormat:@"%@",outDate]];
//***********


NSMutableArray *marks = [NSMutableArray array];


NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDateComponents *comp = [cal components:(NSMonthCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |
                                          NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit)
                                fromDate:startDate];
NSDate *d = [cal dateFromComponents:comp];

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:1];


while (YES) {
    if ([d compare:lastDate] == NSOrderedDescending) {
        break;
    }

    if ([tempData containsObject:[d description]]) {
        [marks addObject:[NSNumber numberWithBool:YES]];
    } else {
        [marks addObject:[NSNumber numberWithBool:NO]];
    }

    d = [cal dateByAddingComponents:offsetComponents toDate:d options:0];
}

return [NSArray arrayWithArray:marks];

}

Надеюсь, это помогло вам.Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

...