3

我已经使用以下步骤将 Tapku 日历库安装到我的项目中:Tapku 日历演示在 xCode4/iOS5 中不起作用

太好了,它进口得很好。没有错误,什么都没有。但是日历并没有出现,即使是那些它运行的loadView功能。出现切换按钮[尽管在这种情况下我没有使用它们进行切换]。

这是重要的注意事项:

此代码(来自实现):

NSLog(@"Toggle called!");

// If calendar is off the screen, show it, else hide it (both with animations)
NSLog(@"y and x = %f & %f", _calendar2.frame.origin.y, _calendar2.frame.origin.x);

NSLog(@"height and width = %f & %f", _calendar2.frame.size.height, _calendar2.frame.size.width);

正在产生:

2012-12-11 17:16:46.294 MyApp[29078:c07] Toggle called!
2012-12-11 17:16:46.295 MyApp[29078:c07] y and x = 0.000000 & 0.000000
2012-12-11 17:16:46.295 MyApp[29078:c07] height and width = 0.000000 & 0.000000

请注意 y 和 x 是如何为零的,即使我已将它们设置为 1。就像 _calender2 不保存任何东西一样?

这是课程:

日历控件视图.h:

#import <UIKit/UIKit.h>
#import "TKCalendarMonthView.h"

@interface CalendarViewController : UIViewController <TKCalendarMonthViewDelegate,TKCalendarMonthViewDataSource> {
    TKCalendarMonthView *calendar;
    struct CGRect cframe;
}

@property(strong, nonatomic) TKCalendarMonthView *calendar2;

@end

日历控件视图.m

#import "CalendarViewController.h"


@implementation CalendarViewController

static int calendarShadowOffset = (int)-20;


@synthesize calendar2 = _calendar2;

#pragma mark -
#pragma mark View Lifecycle

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization.
        _calendar2 =    [[TKCalendarMonthView alloc] init];
        _calendar2.delegate = self;
        _calendar2.dataSource = self;
    }
    return self;
}

- (void)loadView {
    // Costruct the view because we aren't using a

    //int statusBarHeight = 20;
    CGRect applicationFrame = (CGRect)[[UIScreen mainScreen] applicationFrame];
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, applicationFrame.size.width, applicationFrame.size.height)];
    //self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor grayColor];

    // Add top left menu button to toggle calendar

    UIImage *menuButtonImage = [UIImage imageNamed:@"btn-calendar.png"];
    UIImage *menuButtonImageHighlighted = [UIImage imageNamed:@"btn-calendar-highlighted.png"];
    UIButton *menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [menuButton setImage:menuButtonImage forState:UIControlStateNormal];
    [menuButton setImage:menuButtonImageHighlighted forState:UIControlStateHighlighted];
    menuButton.frame = CGRectMake(0, 0, menuButtonImage.size.width, menuButtonImage.size.height);
    UIBarButtonItem *menuBarButton = [[UIBarButtonItem alloc] initWithCustomView:menuButton];
    [menuButton addTarget:self action:@selector(toggleCalendar) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = menuBarButton;

    //[menuBarButton release];


    // Add view button to toggle calendar
    UIButton *toggleButton = [[UIButton alloc] initWithFrame:CGRectMake(50, 300, 220, 50)];
    toggleButton.backgroundColor = [UIColor darkGrayColor];
    toggleButton.titleLabel.font = [UIFont systemFontOfSize:12];
    toggleButton.titleLabel.textColor = [UIColor whiteColor];
    [toggleButton setTitle:@"Toggle Calendar" forState:UIControlStateNormal];
    [toggleButton addTarget:self action:@selector(toggleCalendar) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:toggleButton];
    //[toggleButton release];


    UIButton *toggleButton2 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 220, 50)];
    toggleButton2.backgroundColor = [UIColor darkGrayColor];
    toggleButton2.titleLabel.font = [UIFont systemFontOfSize:12];
    toggleButton2.titleLabel.textColor = [UIColor whiteColor];
    [toggleButton2 setTitle:@"Toggle Calendar2" forState:UIControlStateNormal];
    [toggleButton2 addTarget:self action:@selector(toggleCalendar) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:toggleButton2];

    cframe = CGRectMake(1, 1, _calendar2.frame.size.width, _calendar2.frame.size.height);

    // Add Calendar to just off the top of the screen so it can later slide down
    _calendar2.frame = cframe;
    // Ensure this is the last "addSubview" because the calendar must be the top most view layer
    [self.view addSubview:_calendar2];
    [_calendar2 reload];
    [_calendar2 setHidden:NO];
    _calendar2.alpha = 1.0;
    NSLog(@"Done getting calender there!");

}

- (void)viewDidLoad {
    [super viewDidLoad];
}

// Show/Hide the calendar by sliding it down/up from the top of the device.
- (void)toggleCalendar {

    NSLog(@"Toggle called!");

    // If calendar is off the screen, show it, else hide it (both with animations)
    NSLog(@"y and x = %f & %f", _calendar2.frame.origin.y, _calendar2.frame.origin.x);

    NSLog(@"height and width = %f & %f", _calendar2.frame.size.height, _calendar2.frame.size.width);


}

#pragma mark -
#pragma mark TKCalendarMonthViewDelegate methods

- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
    NSLog(@"calendarMonthView didSelectDate");
}

- (void)calendarMonthView:(TKCalendarMonthView *)monthView monthDidChange:(NSDate *)d {
    NSLog(@"calendarMonthView monthDidChange");
}

#pragma mark -
#pragma mark TKCalendarMonthViewDataSource methods

- (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate {
    NSLog(@"calendarMonthView marksFromDate toDate");
    NSLog(@"Make sure to update 'data' variable to pull from CoreData, website, User Defaults, or some other source.");
    // When testing initially you will have to update the dates in this array so they are visible at the
    // time frame you are testing the code.
    NSArray *data = [NSArray arrayWithObjects:
                     @"2011-01-01 00:00:00 +0000", @"2011-01-09 00:00:00 +0000", @"2011-01-22 00:00:00 +0000",
                     @"2011-01-10 00:00:00 +0000", @"2011-01-11 00:00:00 +0000", @"2011-01-12 00:00:00 +0000",
                     @"2011-01-15 00:00:00 +0000", @"2011-01-28 00:00:00 +0000", @"2011-01-04 00:00:00 +0000",
                     @"2011-01-16 00:00:00 +0000", @"2011-01-18 00:00:00 +0000", @"2011-01-19 00:00:00 +0000",
                     @"2011-01-23 00:00:00 +0000", @"2011-01-24 00:00:00 +0000", @"2011-01-25 00:00:00 +0000",
                     @"2011-02-01 00:00:00 +0000", @"2011-03-01 00:00:00 +0000", @"2011-04-01 00:00:00 +0000",
                     @"2011-05-01 00:00:00 +0000", @"2011-06-01 00:00:00 +0000", @"2011-07-01 00:00:00 +0000",
                     @"2011-08-01 00:00:00 +0000", @"2011-09-01 00:00:00 +0000", @"2011-10-01 00:00:00 +0000",
                     @"2011-11-01 00:00:00 +0000", @"2011-12-01 00:00:00 +0000", nil];


    // Initialise empty marks array, this will be populated with TRUE/FALSE in order for each day a marker should be placed on.
    NSMutableArray *marks = [NSMutableArray array];

    // Initialise calendar to current type and set the timezone to never have daylight saving
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    // Construct DateComponents based on startDate so the iterating date can be created.
    // Its massively important to do this assigning via the NSCalendar and NSDateComponents because of daylight saving has been removed
    // with the timezone that was set above. If you just used "startDate" directly (ie, NSDate *date = startDate;) as the first
    // iterating date then times would go up and down based on daylight savings.
    NSDateComponents *comp = [cal components:(NSMonthCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |
                                              NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit)
                                    fromDate:startDate];
    NSDate *d = [cal dateFromComponents:comp];

    // Init offset components to increment days in the loop by one each time
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    [offsetComponents setDay:1];


    // for each date between start date and end date check if they exist in the data array
    while (YES) {
        // Is the date beyond the last date? If so, exit the loop.
        // NSOrderedDescending = the left value is greater than the right
        if ([d compare:lastDate] == NSOrderedDescending) {
            break;
        }

        // If the date is in the data array, add it to the marks array, else don't
        if ([data containsObject:[d description]]) {
            [marks addObject:[NSNumber numberWithBool:YES]];
        } else {
            [marks addObject:[NSNumber numberWithBool:NO]];
        }

        // Increment day using offset components (ie, 1 day in this instance)
        d = [cal dateByAddingComponents:offsetComponents toDate:d options:0];
    }

    //[offsetComponents release];

    return [NSArray arrayWithArray:marks];
}

#pragma mark -
#pragma mark Memory Management

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}

- (void)dealloc {
    //[super dealloc];
}


@end

我正在运行 XCode 4.5.2 和 iOS6

4

1 回答 1

3

移动行:

    _calendar2 =    [[TKCalendarMonthView alloc] init];
    _calendar2.delegate = self;
    _calendar2.dataSource = self;

initWithNib...到开头loadView,然后将日历视图添加到控制器的视图中:

- (void)loadView {

    [super loadView];

    // Costruct the view because we aren't using a xib file

    _calendar2 =    [[TKCalendarMonthView alloc] init];
    _calendar2.delegate = self;
    _calendar2.dataSource = self;

   [self.view addSubview:_calendar2];

   // rest of the method unchanged....

确实,由于您没有使用笔尖,initWithNib...因此不会调用;loadView然后负责创建视图。

于 2012-12-17T21:08:33.990 回答