2015-02-20 4 views
1

Мне нужно настроить инструкцию if/else, которая сравнивает только месяц и день двух NSDates. Одна из дат выбрана с помощью UIDatePicker, а другая - сегодняшней. Если месяц и дата двух одинаковы, что-то происходит, если не происходит что-то еще.Сравните месяц и день двух NSDates

Вот как я его настроил, но он не работает (всегда срабатывает инструкция else). Не знаете, куда идти отсюда:

.h

@interface ViewController : UIViewController { 
    UIDatePicker *datePicker; 
    NSDate *pickedDate; 
    NSDateFormatter *pickedDateFormat; 
    NSString *pickedDateString; 
    NSDate *todaysDate; 
    NSDateFormatter *todaysDateFormat; 
    NSString *todaysDateString; 
    UILabel *label; 
} 

.m

- (IBAction)buttonToCompareDates:(id)sender { 
    // Sets date from date picker 
    pickedDate = [datePicker date]; 
    pickedDateFormat = [[NSDateFormatter alloc] init]; 
    [pickedDateFormat setDateFormat:@"MM/dd"]; 
    pickedDateString = [pickedDateFormat stringFromDate:pickedDate]; 

    // Sets today's date 
    todaysDate = [NSDate date]; 
    todaysDateFormat = [[NSDateFormatter alloc] init]; 
    [todaysDateFormat setDateFormat:@"MM/dd"]; 
    todaysDateString = [todaysDateFormat stringFromDate:todaysDate]; 

    // if/else statement 
    if (todaysDateString == pickedDateString) { 
     label.text = @"The dates match."; 
    } else { 
     label.text = @"The dates don't match."; 
    } 
} 

Я был в предположении, что это будет работать, но это не так. Мне нужно только сопоставить месячные и дневные разделы NSDates, поэтому я попытался отформатировать их до тех частей и сравнить строки. Проблема в том, что я всегда получаю предложение "The dates don't match.", даже если даты совпадают. Не знаете, почему, могли бы использовать объяснение и правильный путь для этого.

+0

, как я знаю, что NSString может 't сравнить с "==". Вы получите предупреждение «Прямое сравнение строкового литерала имеет неопределенное поведение». try isEqualToString метод –

+0

@HuyNghia вы абсолютно правы, потому что невозможно перегрузить оператора в Objective C. –

ответ

2

Вы должны использовать

if ([todaysDateString isEqualToString:pickedDateString]) { 

вместо

if (todaysDateString == pickedDateString) { 

Потому что вы должны сравнить содержимое строки вместо их указателей.

Также вы можете оптимизировать вам реализацию с помощью той же даты Formatter:

- (IBAction)buttonToCompareDates:(id)sender { 
    dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"MM/dd"]; 

    // Sets date from date picker 
    pickedDate = [datePicker date]; 
    pickedDateString = [dateFormatter stringFromDate:pickedDate]; 

    // Sets today's date 
    todaysDate = [NSDate date]; 
    todaysDateString = [dateFormatter stringFromDate:todaysDate]; 

    // if/else statement 
    if ([todaysDateString isEqualToString:pickedDateString]) { 
     label.text = @"The dates match."; 
    } else { 
     label.text = @"The dates don't match."; 
    } 
} 
+0

Эй, это решило! Никогда не знал, что эта линия существует, но все же новая для Objective-C. Спасибо за быстрый ответ. – Dick

+0

@ Dick Было бы намного легче познакомиться с Objective C, если у вас есть сильный фон на языке C. –

2

Сравнение строк может работать, но это, вероятно, более эффективно использовать NSCalendar так:

NSDate *date1, *date2; 
NSDateComponents* components1 = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date1]; 
NSDateComponents* components2 = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date2]; 
if (components1.month == components2.month && components1.day == components2.day) { 
    // same month and day 
} else { 
    // not same month and day 
} 
+0

Для iOS 8.0+ используйте 'NSCalendarUnitMonth | NSCalendarUnitDay' как' NSMonthCalendarUnit' устарел с iOS 8.0 –

Смежные вопросы