【问题标题】:set uidatepicker date from string从字符串设置 uidatepicker 日期
【发布时间】:2015-03-17 09:43:25
【问题描述】:

问题更新:

我有一个应用程序,用户可以在其中添加一个新的研讨会,包括他从UIDatePicker 中选择的研讨会日期。之后,用户可以编辑研讨会的信息,包括更改日期。我想做的是以下几点: 1.读取用户在添加新工坊时从UIDatePicker中选择的时间。 2. 将日期转换为字符串并保存在数据库中。 3. 当用户想要编辑车间时,我应该从数据库中检索车间的日期并将其从字符串转换为NSDate。 4.将Edit界面中的UIDatePicker设置为我刚刚创建的NSDate

我认为这听起来合乎逻辑。但是,它对我不起作用,我不知道为什么。这是代码:

AddWorkshop.m 类中

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateStyle:NSDateFormatterMediumStyle];
 //WSDate is a NSString variable
self.WSDate = [dateFormat stringFromDate:[sender date]];

EditWorkshop.m 类中

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
 [df setDateStyle:NSDateFormatterMediumStyle];
NSDate *date1 = [df dateFromString: self.WSDate];
[self.datePicker setDate:date1];

问题是:

  1. UIDatePicker 日期不会更改为指定日期,它始终显示今天的日期。

  2. 当我尝试 NSLog date1 和 self.WSDate 时,date1 的值总是少一天然后self.WSDate的值

  3. 我在 [UIDatePicker setDate: NSDate] 中传递的日期是否有特定格式?例如:它必须是“MMMM dd yyyy”或“mm-dd-yyyy”还是任何格式都可以?

【问题讨论】:

  • 你能分享你在UIDatePicker中设置date1的代码吗?
  • 我更新了帖子..代码是[self.datePicker setDate:date1];
  • 为什么要将日期转换为字符串,为什么不能像核心数据一样将其存储为时间戳
  • 关于问题 1,可能是您以错误的方法设置日期或未在 UI 线程上设置日期。关于问题2,为什么要在NSDateNSString之间来回转换?如果可能,您应该存储NSDate 本身。这可能是您的NSDateFormatter 的时区问题。
  • 因为我习惯于将日期保存在数据库中的字符串中。以前从未尝试过时间戳。尽管如此,这是否解释了 UIDatePicker 的奇怪行为?

标签: ios objective-c nsdate uidatepicker


【解决方案1】:

广告 1:您要更新的位置 viewDidLoad 在加载视图时仅调用一次 UIDatePicker。因此,在您的情况下,这可能是一个问题。尝试从viewWillAppear:viewDidAppear: 调用方法

广告 2:这很可能是时区问题。尝试将日期存储为NSDate,而不是在NSDateNSString 之间来回转换。

广告 3:setDate: 需要 NSDate,它没有格式。把它想象成一个整数。

【讨论】:

  • 我按照你在广告 1 2 中说的做了,问题还是一样。 UIDatePicker 不会设置我传入的 NSDate [UIDatePicker setDate: date];
  • 我 NSLoged 了 setDate: 方法中传递的日期,就像这样 (2015-05-10 06:35:13 +0000) 是传递给 UIDatePicker 的正确日期吗?
【解决方案2】:

永远不要将NSDate 作为NSString 存储在您的数据库中,始终尝试将其作为时间戳存储,就像核心数据一样。

对于您当前的问题,下面给出的代码应该可以帮助您解决问题,我在UIButton 上使用IBAction,它将在UIDatePicker 控件中显示转换后的NSString 日期。

- (IBAction)buttonPressed:(id)sender{

// set date of picker from string
NSDate *convertedDate = [self convertStringToDate];
if (convertedDate!=nil) {
    [self.datePicker setDate:convertedDate animated:YES];
}else{
    // Display any error here
}
  }

- (NSDate*)convertStringToDate{
    NSDateFormatter *SDF = [[NSDateFormatter alloc]init];
    [SDF setDateStyle:NSDateFormatterMediumStyle];
    NSDate *convertedDate = [SDF dateFromString:[self convertTodaysDateintoString]];
    return convertedDate;
   }

- (NSString*)convertTodaysDateintoString{
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateStyle:NSDateFormatterMediumStyle];
NSString *str = [df stringFromDate:[self getTodaysDate]];
return str;
}

- (NSDate*)getTodaysDate{
return [NSDate date];
}

对于第 2 期,请验证您的时区,我不确定第 3 号问题目前我还没有看到UIDatePicker 的任何具体日期格式,它只接受NSDate

对于 3,我建议检查 UIDatePicker 模式并尝试在 XIB/storyboard 属性检查器中将本地设置为默认值。

【讨论】:

  • 感谢您的努力。但是,我在过去几天尝试了您的解决方案,但它对我不起作用。我还尝试使用 sqlite3_bind_double(compileStatement1, 8, [date timeIntervalSince1970]); 将数据库中的日期保存为时间戳。和 [NSDate dateWithTimeIntervalSince1970:dateFromDB];我成功地从数据库中存储和检索了日期。但是设置 UIDatePicker 的问题仍然存在:(
  • @Alsmayer:您是否检查过您是否已将插座正确连接到 UIDatePicker,即您是否在应用程序中使用了 .xib/.storyboard
  • 是的,我有好几次。我什至删除了插座并重新连接。我在一个全新的 singleView 项目中尝试了相同的代码,并且效果很好。显然,我的主要项目中存在一些冲突或某些东西
  • @Alsmayer:如果是这种情况,那么我建议删除您在其中添加选择器代码的类文件并重新创建它,看看它是否有效,有时 Xcode 的行为确实很奇怪
  • 我按照你说的做了,但是没用。但是,您的提示让我修改了我的代码并意识到我正在使用 self.datepicker = [[UIDatePicker alloc]init]; 将 UIDatePicker 设置为新的我删除了这段代码,一切都为我解决了! :) 我将发布答案,如果您能解释为什么会发生这种情况,我会很高兴,因为它让我感到困惑。感谢您的努力
【解决方案3】:

经过几周的尝试,我发现问题在于我在 viewDidLoad 中分配和初始化我的 UIDatePicker

self.datePicker = [[UIDatePicker alloc]init];

因此,当我使用[datePicker setDate: date]; 时,它不起作用。我不知道究竟是为什么。但对我来说就是这样。我刚刚删除了 self.datePicker = [[UIDatePicker alloc]init]; 并且 setDate 方法有效。

如果有人能详细解释为什么分配UIDatePicker 会使setDate 方法不起作用,我会很高兴。我认为我需要分配所有新对象才能使用它们,因为例如当我创建一个新的 NSMutableArray 时,如果我不先分配它,我就无法向它添加对象。 谢谢大家的努力。

【讨论】:

  • 你不需要分配一个属性,当你使用一个属性时分配一个内存A,当你重新初始化它时,分配一个内存B,你将处于以下模式将使用内存 A,但实际上正在使用它的 B,因此删除重新分配部分对您有用,希望能解释
  • @NSDumb 现在我明白了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多