我有一个选择日期。什么时候我改变日期和显示。它的工作正常。但如果我没有更改任何日期并按下确定按钮。得到崩溃。这是我的代码:
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];
谢谢
您只在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]];
}
}