按下确定按钮时选择当前日期和年份时崩溃

问题描述 投票:0回答:1

我有一个选择日期。什么时候我改变日期和显示。它的工作正常。但如果我没有更改任何日期并按下确定按钮。得到崩溃。这是我的代码:

NSDate *reportingDate;
 NSDateFormatter *pickerDateFormatter;

- (void)viewDidLoad {

  [self updatePickerUI];
}

- (void)updatePickerUI {
    _pickerView.hidden = true;
    self.picker.monthPickerDelegate = self;
    self.picker.maximumYear = 2115;
    self.picker.minimumYear = 1900;
    self.picker.yearFirst = YES;
    NSString *mon = [userDefault objectForKey:@"monthText"];
    NSString *yr = [userDefault objectForKey:@"YearText"];

     NSLog(@"%@%@", mon,yr);
    self.dateLabel.text = [NSString stringWithFormat: @"%@,%@", mon, yr];
}

- (NSString*)formatDate:(NSDate *)date
{

    if (pickerDateFormatter == nil) {
        pickerDateFormatter = [[NSDateFormatter alloc] init];
    }
    pickerDateFormatter.dateFormat = @"MMM, yyyy";
    return [pickerDateFormatter stringFromDate:date];
}
- (void)monthPickerDidChangeDate:(SRMonthPicker *)monthPicker
{
    reportingDate = monthPicker.date;
    NSString *selectedDate = [self formatDate:reportingDate];
    [self updateDateLabel:selectedDate];
}

好的按钮动作:

 - (IBAction)pickerAction:(id)sender {
    if ([sender isKindOfClass:[UIButton class]]) {
            UIButton *button = (UIButton *)sender;
            if ([button.titleLabel.text isEqualToString:@"Cancel"]) {
                return;
            }
        }
     NSDate *pickerDate = reportingDate;
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:pickerDate];
        NSInteger reportingMonth = [components month];
        NSInteger reportingYear = [components year];

 NSString *Month = [NSString stringWithFormat:@"%ld", (long)reportingMonth];
    NSString *Yrs = [NSString stringWithFormat:@"%ld", (long)reportingYear];
    NSString *temp = @"0";
    if (Month.length == 1) {
        SelMonth = [temp stringByAppendingString:Month];
    }else {
        SelMonth = Month;
    }
    [str setObject:SelMonth forKey:@"month"];
    [str setObject:Yrs forKey:@"year"];
    NSString *Mont =  [self MonthNameString:[SelMonth integerValue]];
    }

这一行崩溃:

NSInteger reportingMonth = [components month]; NSInteger reportingYear = [components year];

谢谢

ios objective-c iphone xcode date
1个回答
0
投票

您只在reportingDate方法中设置monthPickerDidChangeDate:属性。因此,只有在更改选择器中的日期时才会调用它并将值设置为reportingDate。在显示选择器时将默认/选定值设置为reportingDate属性将解决您的问题。

如果您只是需要避免崩溃,请尝试这个,

- (IBAction)pickerAction:(id)sender {
    if ([sender isKindOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)sender;
        if ([button.titleLabel.text isEqualToString:@"Cancel"]) {
            return;
        }
    }
    if (reportingDate != nil) { //add a nil check here
         NSDate *pickerDate = reportingDate;
         NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
         NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:pickerDate];
         NSInteger reportingMonth = [components month];
         NSInteger reportingYear = [components year];
         NSDate *pickerDate = reportingDate;
         NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
         NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:pickerDate];
         NSInteger reportingMonth = [components month];
         NSInteger reportingYear = [components year];

         NSString *Month = [NSString stringWithFormat:@"%ld", (long)reportingMonth];
         NSString *Yrs = [NSString stringWithFormat:@"%ld", (long)reportingYear];
         NSString *temp = @"0";
         if (Month.length == 1) {
             SelMonth = [temp stringByAppendingString:Month];
         }else {
             SelMonth = Month;
         }
         [str setObject:SelMonth forKey:@"month"];
         [str setObject:Yrs forKey:@"year"];
         NSLog(@"%@", SelMonth);
         NSString *Mont =  [self MonthNameString:[SelMonth integerValue]];
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.