我正在使用Tapku库来执行日历。我可以看到有一种方法可以为预定义的开始日期和结束日期添加Markers,但我想允许用户选择/取消选择当前月份仅的任意数量的日期,并希望为每个动作生成事件。
此外,我已经关闭月导航功能,返回左箭头和右箭头的nil,仅显示当前月份,但无法删除前几个月和下个月的事件。当前月份显示的日期切片。我仍然可以选择上个月的第31天导航到上个月或选择下个月的第1个导航到下个月。我可以将日期选择限制在当前月份吗?
感谢。
答案 0 :(得分:2)
通过以下方法在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
以查看正在发生的事情。
所以引入多日期选择并不容易。该架构不是为此而构建的。
答案 1 :(得分:2)
在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 :(得分:0)
您也可以尝试以下代码:
您可以先在数组中输入日期来完成此操作。代码是。
- (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];
}
我希望,这对你有帮助。如果您遇到任何问题,请告诉我。