【问题标题】:IOS: simulate a calendarIOS:模拟日历
【发布时间】:2011-04-19 07:44:35
【问题描述】:

我有这个代码

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setYear:2011];
[components setDay:1];
[components setMonth:7];
NSCalendar *gregorianCalendar = [[[NSCalendar alloc]       initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *date = [gregorianCalendar dateFromComponents:components];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];
NSString *strDate = [dateFormatter stringFromDate: date];

但现在我想为每个月的每一天设置 31 个标签:如何为每个标签添加此组件?

[components setDay:1];

我也希望所有的星期天都是红色的,那么每 7 天的标签必须是红色的;你能帮帮我吗?

【问题讨论】:

  • 我没有看到任何标签代码。
  • 我的31个标签不知道怎么打码;我可以为第一个标签设置 first.text = strDate;其中“第一”是我的标签;但是之后?其他标签?我必须为 [components setDay:1] 添加一个值;没有?

标签: objective-c xcode ios label nsdate


【解决方案1】:

循环是你的朋友:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setYear:2011];
[components setDay:1];
[components setMonth:7];
NSCalendar *gregorianCalendar = [[[NSCalendar alloc]       initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *firstDate = [gregorianCalendar dateFromComponents:components];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];

for (int i = 0; i < 31; i++) {
   NSTimeInterval seconds = 24*60*60 * i;
   NSDate *date = [NSDate dateWithTimeInterval:seconds sinceDate:firstDate];
   NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:date];
   int weekday = [weekdayComponents weekday];
   NSString *strDate = [dateFormatter stringFromDate: date];
   yourLabel.text = strDate;
   yourLabel.textColor = weekday == 1 ? [UIColor redColor : blackColor];
}

请将yourLabel 变量调整为合适的。

【讨论】:

  • 是的...但是为什么我必须做一个“for”?我有 31 个标签:first.text、second.text、third.text ecc... 每个标签都有其价值;当我制作这个东西时,我将创建一个 IBAction,我可以在其中为我的标签添加一个月,所以当我按下按钮时,所有标签都会更改其下个月的值...
  • 当然,您不必使用循环。它只是为您节省了一百行代码。但是,您仍然需要数组或类似的标签才能方便地访问它们。
【解决方案2】:

这就像@Eiko 的回答,除了在处理夏令时、没有 31 天的月份等问题时更正确:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setYear:2011];
[components setMonth:7];
[components setDay:1];

NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *startDate = [gregorianCalendar dateFromComponents:components];
NSRange rangeOfDays = [gregorianCalendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:startDate];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];

for (NSInteger i = 1; i <= NSMaxRange(rangeOfDays); ++i) {
  [components setDay:i];
  NSDate *date = [gregorianCalendar dateFromComponents:components];

  yourLabel.text = [dateFormatter stringFromDate: date];

  NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:date];
  int weekday = [weekdayComponents weekday];

  yourLabel.textColor = weekday == 1 ? [UIColor redColor : blackColor];
}

[dateFormatter release];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多