在 Xcode 上使用 NSDatePickerView 分别处理日期和时间

Working with Date and Time separately using NSDatePickerView on Xcode

我有一部分应用程序可以设置约会的日期和时间。为此,我有两个NSDatePickerView。第一个我设置为NSDatePickerModeDate,而另一个设置为NSDatePickerModeTime。但实际上他们应该在 NSMutableDictionary 条目中引用相同的 NSDate 对象。我知道 NSDatePickerModeDateTime,但我需要单独选择日期和时间。

我知道如何设置 NSDatePickerView 来显示和隐藏以及事件控制等,但是在事件控制 UIControlEventValueChanged 触发 NSDatePickerView 时,我很困惑如何为此更改编码,以及如何初始化选择器 (datePicker.date = today, timePicker.date = "9:00 AM")

@interface MyViewController () {
    NSMutableDictionary *data;
}

@end

@implementation MyViewController

@synthesize datePicker, timePicker;

- (void) viewDidLoad {
    [super viewDidLoad];
    data = [[NSMutableDictionary alloc] init];
    [data setObject:[NSDate date] forKey:@"date"];

    datePicker.datePickerMode = UIDatePickerModeDate;
    timePicker.datePickerMode = UIDatePickerModeTime;

    [datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged];
    [timePicker addTarget:self action:@selector(changeTime:) forControlEvents:UIControlEventValueChanged];

    datePicker.date = data[@"date"]; //????
    timePicker.date = data[@"date"]; //????
}

- (IBAction) changeDate:(id)sender {
    UIDatePickerView *dp = (UIDatePickerView *)sender;
    [data setObject:dp.date forKey:@"date"]; //????
}

- (IBAction) changeTime:(id)sender {
    UIDatePickerView *tp = (UIDatePickerView *)sender;
    [data setObject:tp.date forKey:@"date"]; //????
}

我不知道如何编码的部分用//????表示。我在一些答案中读到了 NSDateFormatterNSCalendar 和某种日期组件,但这实际上让我更加困惑,因为它也将字符串和结构混合在一起,使用什么来什么时候做什么。请帮忙。

你可以试试这个

///将完整日期转换为唯一日期

- (IBAction) changeDate:(UIDatePickerView *)sender {

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
 [dateFormatter setDateFormat:@"MM/dd/yyyy"];
 NSString *dateStr = [dateFormatter stringFromDate:[sender date]];
 [data setObject:dateStr forKey:@"date"];
}

///将日期转换为时间格式

- (IBAction) changeTime:(UIDatePickerView *)sender {

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
 [dateFormatter setDateFormat:@"hh:mm a"];
 NSString *dateStr = [dateFormatter stringFromDate:[sender date]];
 [data setObject:dateStr forKey:@"Time"];
}

您可以将两个日期选择器设置为相同的日期和时间。未使用的部分在那里,但不显示且无法更改。当用户更改一个日期选择器的值时,您必须将另一个日期选择器设置为相同的值。

- (IBAction)changeDate:(id)sender {
    NSDatePicker *dp = (NSDatePicker *)sender;
    [data setObject:dp.dateValue forKey:@"date"];
    self.timePicker.dateValue = dp.dateValue;
}

- (IBAction)changeTime:(id)sender {
    NSDatePicker *tp = (NSDatePicker *)sender;
    [data setObject:tp.dateValue forKey:@"date"];
    self.datePicker.dateValue = tp.dateValue;
}