1

カレンダーの実装にTapkuライブラリを使用しています。事前定義された開始日と終了日のマーカーを追加する方法があることがわかりましたが、ユーザーが現在の月のみから任意の数の日付を選択/選択解除できるようにし、各アクションのイベントを生成したいと考えています。

さらに、左矢印と右矢印に nil を返して現在の月のみを表示することで月のナビゲーション機能をオフにしましたが、現在の月に表示される前月と次月のいくつかの日付タイルのイベントを削除することはできません。前月の 31 日を選択して前の月に移動したり、翌月の 1 日を選択して翌月に移動したりできます。日付の選択を当月のみに制限できますか?

ありがとう。

4

3 に答える 3

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コード内でを検索して、何が起こっているかを確認できます。

したがって、複数の日付選択を導入するのはそれほど簡単ではありません。アーキテクチャはそのために構築されていません。

于 2012-03-13T16:16:22.470 に答える
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 

上記の方法はタイルを配置するために使用されますが、選択画像が必要な場合は、タイル画像に置き換えることができます

于 2012-03-14T11:33:10.680 に答える
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;
}

}

この後、ボタン クリック アクションを使用して、これら 2 つの日付の間で日付を選択する必要があります。そのコードは次のとおりです。

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

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

}

}

次に、1 つのデリゲート メソッドで、これら 2 つの日付の間のすべての日付を含む配列を作成するだけです。ボタンがクリックされた直後に呼び出されます。そのコードは次のとおりです。

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

}

お役に立てば幸いです。問題が発生した場合はお知らせください。

于 2013-05-06T09:52:29.007 に答える