【问题标题】:DatePicker stopping CoreData working as expectedDatePicker 停止 CoreData 按预期工作
【发布时间】:2011-05-18 14:22:33
【问题描述】:

我有一个应用程序,它可以保存 UIDatePicker 中的文本和日期,然后在您回到 UIDatePicker 中的那个日期时显示该注释。

效果很好!只有我发现将 UIDatePicker 日期设置为今天会停止 CoreData 的工作。

只有当我运行这个 setDate 行时,它才会停止核心数据的工作。该应用程序运行良好而不会崩溃,它只是不保存任何数据。如果我评论那条线,它会很有魅力。但是我今天需要在应用加载时打开 UIDatePicker。

我在应用程序启动时使用它:

NSDate *now = [[NSDate alloc] init];
[datePicker setDate:now];

这个来获取笔记:

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
        NSEntityDescription *testEntity = [NSEntityDescription entityForName:@"DatedText" inManagedObjectContext:self.managedObjectContext];
        [fetch setEntity:testEntity];
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"dateSaved == %@", datePicker.date];
        [fetch setPredicate:pred];
        
        NSError *fetchError = nil;
        NSArray *fetchedObjs = [self.managedObjectContext executeFetchRequest:fetch error:&fetchError];
        if (fetchError != nil) {
            NSLog(@"fetchError = %@, details = %@",fetchError,fetchError.userInfo);
        }
        noteTextView.text = [[fetchedObjs objectAtIndex:0] valueForKey:@"savedText"];

这是保存笔记:

NSManagedObject *newDatedText;
    newDatedText = [NSEntityDescription insertNewObjectForEntityForName:@"DatedText" inManagedObjectContext:self.managedObjectContext];
    [newDatedText setValue:noteTextView.text forKey:@"savedText"];
    [newDatedText setValue:datePicker.date forKey:@"dateSaved"];
    
    NSError *saveError = nil;
    [self.managedObjectContext save:&saveError];
    if (saveError != nil) {
        NSLog(@"[%@ saveContext] Error saving context: Error = %@, details = %@",[self class], saveError,saveError.userInfo);
    }

【问题讨论】:

  • 您发布的最后几行代码表明 -save: 如果无法保存,方法将返回一个错误。你看到错误了吗?如果有,是什么?如果没有错误,你怎么确定它没有保存任何东西?您如何准确地验证这一点?此外,您在应用程序启动时的第一个代码块似乎泄漏了 NSDate 实例。你分配/初始化而不释放它。尝试 [NSDate date] 返回一个自动释放的实例,或者在你完成它之后释放它(在你把它交给日期选择器之后)。

标签: iphone objective-c ipad core-data uidatepicker


【解决方案1】:

记住 NSDate 不仅保存 DD/MM/YYYY,还保存 HH:MM:SS。

我猜我认为当您从选择器中选择 DD/MM/YYYY 时,它会以默认时间 0:00:00 保存,但在上述情况下,当您将选择器日期设置为现在时,您实际上是在操作HH:MM:SS 到别的东西(即使你没有手动看到它)。

为了说明我想说的是,当您使用谓词 (dateSaved == picker.date) 获取时,它正在寻找格式为 DD/MM/YYYY 00:00:00 的日期和争论的缘故你可能已经把它保存在 DD/MM/YYYY 09:00:01。

如果你想让它起作用,你需要对你的 NSDate 属性做一些格式化。

【讨论】:

  • 所以我需要进行格式化,这样我才能制作某种格式为 DD/MM/YYYY 00:00:00 的 NSDateFormatter,但是如何将时间保持为零?
  • 如何在强制时间归零的同时制作 NSDate?你是这个意思吗?
【解决方案2】:

日期选择器默认设置为今天的日期。您无需手动操作。

【讨论】:

  • 不,它没有。我在 Interface Builder 中有一个,它在检查器中有一个实际属性,您可以在其中设置它开始的日期和时间。遗憾的是,没有自动今天的日期选项。
  • 引用 Apple 文档:“默认是创建 UIDatePicker 对象的日期。” developer.apple.com/library/ios/#documentation/uikit/reference/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2012-04-18
相关资源
最近更新 更多