Я знаю, как отображать сегодня месяц с годом с помощью метки. Я использую этот код.

// show the present month
    NSDate *date = [NSDate date];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat=@"MMMM";
    NSString * monthString = [[dateFormatter stringFromDate:date] capitalizedString];
    dateFormatter.dateFormat=@"yyyy";
    NSString * yearString = [[dateFormatter stringFromDate:date] capitalizedString];
    dateLabel.text = [NSString stringWithFormat:@"%@ ,%@",monthString,yearString];

Этот код выше будет отображать текущий месяц с годом. Но мне нужно это. Мне нужно сделать как на изображении ниже

1 .. введите здесь описание изображения

Итак, todays date is 29th Dec и он должен start with 29Dec и должен отображаться следующим 6 days date. Точно так же, когда пользователь открывает на tomorrow, например, on 30th dec. Мне нужно отобразить, как показано ниже:

2 .. введите здесь описание изображения

Точно так же, когда пользователь открывает мое приложение на 31 Dec, оно должно выглядеть так.

3 .. введите здесь описание изображения

Поэтому, когда когда-либо пользователь открывает мое приложение, только currrent date должен находиться в first с непрерывным включением next 6 days date.

Пожалуйста, помогите мне, как это сделать. Я новичок в ios. Ваша помощь будет мне очень полезна, чтобы узнать больше.

Отредактированный :

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize flabel;
@synthesize slabel;
@synthesize tlabel;
@synthesize folabel;
@synthesize fivlabel;
@synthesize sixlabel;
@synthesize sevenlabel;


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


    NSArray *labelArray = @[flabel, slabel, tlabel, folabel, fivlabel,sixlabel, sevenlabel ];
    NSDate *today = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    dateFormatter.dateFormat = @"ddMMM";
    for (NSInteger i = 0; i < 7; ++i) {
        NSDate *nextDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:i toDate:today options:nil];
        UILabel *label = (UILabel *)labelArray[i];
        label.text = [dateFormatter stringFromDate:nextDate];
    }


}
-1
Maddey 29 Дек 2015 в 19:20

4 ответа

Лучший ответ

Этот код создает дату в формате ddMMM для сегодняшнего дня и следующих 6 дней. Поместите метки в массив и назначьте даты меткам по индексу.

NSArray *labelArray = @[firstDateLabel, secondDateLabel ...   ];

NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSCalendar *calendar = [NSCalendar currentCalendar];
dateFormatter.dateFormat = @"ddMMM";
for (NSInteger i = 0; i < 7; ++i) {
  NSDate *nextDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:i toDate:today options:nil];
  UILabel *label = (UILabel *)labelArray[i];
  label.text = [dateFormatter stringFromDate:nextDate];
}

Однако он не учитывает возможные проблемы с переходом на летнее время. Текущая дата должна быть установлена на безопасное время, когда не может возникнуть никаких проблем.

3
vadian 29 Дек 2015 в 20:16

Поскольку вы знаете, как получить необходимую информацию из NSDate, вам нужно только увеличить эту дату на 1 день.

Это легко сделать с помощью dateByAddingTimeInterval:

// 86400 is the number of seconds in 1 day
NSDate *nextDay=[currentDay dateByAddingTimeInterval:86400];
-2
skypjack 29 Дек 2015 в 16:48

Взгляните на NSCalendar и раздел календарных расчетов.

Вам нужно получить текущий календарь.

Загрузите компоненты месяца / дня / года с начальной даты. (Cегодня?)

Установите значение часов компонентов даты на 12 (чтобы избежать проблем с датами, которые меняются с летнего времени на стандартное время, дни, когда добавляются дополнительные секунды и т. Д.)

Используйте dateFromComponents, чтобы получить NSDate на полдень в рассматриваемый день. Назовем это noonDate.

Используйте dateByAddingUnit: value: toDate: options:, чтобы добавить день к noonDate:

Подайте результат dateByAddingUnit: value: toDate: options: в модуль форматирования даты, чтобы отобразить его в локализованной версии желаемого формата отображения.

1
Duncan C 29 Дек 2015 в 16:32

вы не пометили свой вопрос objective-c, поэтому я написал быстрый код, так как использовать игровые площадки намного удобнее.

Чтобы избежать летнего времени и подобных ошибок, я использую для расчета NSDateComponents.

Результатом кода является массив, содержащий метки.

import UIKit
let cal = NSCalendar.currentCalendar()
let now = NSDate()

var dates = [NSDate]()
for i in 0..<7 {
    let comps = cal.components([.Day, .Month, .Year], fromDate: now)
    comps.day += i
    dates.append(cal.dateFromComponents(comps)!)
}

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dMMM"
let labels = dates.map { (date) -> UILabel in
    let dateSting = dateFormatter.stringFromDate(date)
    let l = UILabel()
    l.backgroundColor = UIColor.whiteColor()
    l.textColor = UIColor.blackColor()
    l.text = dateSting
    l.sizeToFit()
    return l
}
1
vikingosegundo 29 Дек 2015 в 17:30