Custom DatePicker using UIPIckerView

社会主义新天地 提交于 2019-12-12 06:23:36

问题


I am new to ios development. I am making a custom datepicker using uipickerview. I have datesArray to be used as a data source for uipickerview.

I want to know how to show only Labels : today,tomorrow,Fri,Sat,Sun,Mon,Tues for current week and rest dates in format "EEE, LLL d".

I tried this code but it didn't work.

for(int i=0;i<22;i++)
{
    NSDate *myDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * i];
    NSDate *now=[NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateFormat:@"EEE, LLL d"];
    if(myDate==now)
    {
        NSString *myDateString=@"today";
         [datesArray addObject:myDateString];
    }
    else
    {
    NSString *myDateString = [dateFormatter stringFromDate:myDate];

    [datesArray addObject:myDateString];
    }

}

回答1:


Try this.Hope it helps

 NSString *dateFromWS = @"2013-10-16";//im taking it as static you have to take string coming from webservice

 for (int i = 0; i < 22; i++)
 {
    NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
    [dateFormatter1 setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter1 setDateFormat:@"yyyy-MM-dd"];
    NSDate *myDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * i];
    NSDate *now = [dateFormatter1 dateFromString:dateFromWS];
    NSDate *tomorrow = [NSDate dateWithTimeInterval:60 * 60 * 24 * 1 sinceDate:now];
    //NSDate *dummy = [NSDate dateWithTimeInterval:60 * 60 * 24 * 1 sinceDate:now];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateFormat:@"EEE, LLL d"];
    NSString *loopDate = [dateFormatter stringFromDate:myDate];
    NSString *today = [dateFormatter stringFromDate:now];
    NSString *tomorrowString = [dateFormatter stringFromDate:tomorrow];
    if ([loopDate isEqualToString:today]) {
        [datesArray addObject:@"today"];
    } else if ([loopDate isEqualToString:tomorrowString]) {
       [datesArray addObject:@"tomorrow"]; 
    } else if ((i/7) < 1) {
        [datesArray addObject:[loopDate substringToIndex:3]];
    } else {
        [datesArray addObject:loopDate];
    }
 }



回答2:


if(myDate==now)

is comparing 2 pointers not 2 dates. You need to use the below code

if([myDate compare:now] == NSOrderedSame)



回答3:


In addition to Simon's pointer issue, your dates will include the time info and so is never likely to be identical. May be the same day but not the same time. You need to find if the day matches. I do this by:

for(int i=0;i<22;i++)
{
    NSDate *myDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * i];
    NSDate *myDateNoTime = nil;
    // Note: Create sysCal as a property so it is not being repeatedly recreated here
    [self.sysCal rangeOfUnit:NSDayCalendarUnit startDate:&myDateNoTime interval:nil forDate:myDate];
    NSDate *now=[NSDate date];
    NSDate *todayDateNoTime = nil;
    [self.sysCal rangeOfUnit:NSDayCalendarUnit startDate:&todayDateNoTime interval:nil forDate:now];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateFormat:@"EEE, LLL d"];

    if([myDateNoTime isEqualToDate:todayDateNoTime])
    {
        NSString *myDateString=@"today";
         [datesArray addObject:myDateString];
    }
    else
    {
    NSString *myDateString = [dateFormatter stringFromDate:myDate];

    [datesArray addObject:myDateString];
    }

}



回答4:


Given your server date requirement and, in my opinion, a better way of handling a picker, I would put this in the datasource method instead.

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

    NSString *resultString = nil;
    NSDate *myDate = [self dateForRow:row];
    NSDate *myDateNoTime = nil;
    // Note: Create sysCal as a property so it is not being repeatedly recreated here
    [self.sysCal rangeOfUnit:NSDayCalendarUnit startDate:&myDateNoTime interval:nil forDate:myDate];
    NSDate *now=[NSDate date];
    NSDate *todayDateNoTime = nil;
    [self.sysCal rangeOfUnit:NSDayCalendarUnit startDate:&todayDateNoTime interval:nil forDate:now];

    if([myDateNoTime isEqualToDate:todayDateNoTime])
    {
       resultString = @"Today";
    } else {
       // Note: using property for date formatter so I am not repeatedly creating here
       resultString = [self.dayFormatter stringFromDate:myDate];
    }

    return resultString;
}

To determine date for the row use:

-(NSDate *)dateFromRow:(NSInteger)inRow {
   NSDateComponents *daysToAdd = [[NSDateComponents alloc] init];
   [daysToAdd setCalendar:self.sysCal];
   NSInteger daysCalc = (-1 * (inRow -2));
   [daysToAdd setDay:daysCalc];
   NSDate *resultDate = nil;

   NSDate *calcDate = [self.sysCal dateByAddingComponents:daysToAdd 
                                                   toDate:self.myServerDate 
                                                  options:0];

   [self.sysCal rangeOfUnit:NSDayCalendarUnit startDate:&resultDate interval:nil forDate:calcDate];

   return resultDate;
}

I suppose you are already set with the way you are doing it but I think you would find this more flexible, no limit to 21 days before or after the server date. Aircode, excuse any typos or syntax errors.




回答5:


Swift 4.0

for i in 0..<22 {
    var myDate = Date(timeIntervalSinceNow: 60 * 60 * 24 * i)
    var now = Date()
    var dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.dateFormat = "EEE, LLL d"

    if myDate == now {
       var myDateString = "today"
       datesArray.append(myDateString)
    } else {
       var myDateString: String = dateFormatter.string(from: myDate)
       datesArray.append(myDateString)
   }
}


来源:https://stackoverflow.com/questions/19401805/custom-datepicker-using-uipickerview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!