iOS:Tapku日历库 - 允许选择当月的多个日期

时间:2012-03-13 15:05:57

标签: ios calendar tapku

我正在使用Tapku库来执行日历。我可以看到有一种方法可以为预定义的开始日期和结束日期添加Markers,但我想允许用户选择/取消选择当前月份的任意数量的日期,并希望为每个动作生成事件。

此外,我已经关闭月导航功能,返回左箭头和右箭头的nil,仅显示当前月份,但无法删除前几个月和下个月的事件。当前月份显示的日期切片。我仍然可以选择上个月的第31天导航到上个月或选择下个月的第1个导航到下个月。我可以将日期选择限制在当前月份吗?

感谢。

3 个答案:

答案 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;
}

选择/取消选择可能无法按预期工作。它不像setDateSelectedsetDateDeselected ..而是有一个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];

}

我希望,这对你有帮助。如果您遇到任何问题,请告诉我。