iOS: библиотека календарей Tapku – позволяет выбрать несколько дат для текущего месяца

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

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

Благодарю.

TKCalendarMonthView.m обрабатываются в 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 в коде, чтобы видеть, что происходит.

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

В 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 

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

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

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

 - (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]; 

}

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

Interesting Posts
Давайте будем гением компьютера.