使用导航栏按钮项和核心数据在视图控制器之间传递日期

Posted

技术标签:

【中文标题】使用导航栏按钮项和核心数据在视图控制器之间传递日期【英文标题】:Passing a Date Between View Controllers With a Navigation Bar Button Item and Core Data 【发布时间】:2014-03-11 11:40:03 【问题描述】:

我遇到了一个不知道如何开始工作的问题。

我有一个表格视图控制器 (TV1),它嵌入在带有 2 个选项卡的选项卡栏中。 TV1 由用户单击导航栏按钮项以添加名称、事件、金额和日期来填充。当他们点击保存时,表格视图通过使用 NSFetchedResultsController 和核心数据来填充。

第一个选项卡按时间顺序显示条目。第二个仅显示事件列表,因此您不会看到所有内容,而只会看到您创建的独特事件。如果您进入一个事件,您会看到该事件的所有“交易”。因此,如果您有 4 个事件(生日、婚礼、周年纪念、新年),您将在第二个选项卡中看到。如果你点击婚礼,你会看到所有有婚礼事件的交易。

到目前为止效果很好。我想介绍一个新功能。如果用户进入婚礼(他们可以看到婚礼事件的所有交易)并单击导航栏中的加号按钮,他们将被带到添加条目屏幕,在那里他们可以快速输入一些新条目。

在此处添加此加号按钮的原因也是因为我希望已填充事件和日期,因为这将始终保持不变。只是用户必须填写的名称和金额。

编辑(稍微改变问题的要求 - 仍然是相同的要求,但现在我明白了我的要求)。

婚礼表视图(选定的事件)具有部分和行。行是单个交易,部分是字符串形式的日期(从日期(transaction.date.dateOfEvent)转换而来。

我想要的是以下内容:

1) 取第一个section字符串(可能有多个section,所以我只想要第一个)

2) 将其转换为日期

3) 在 prepareForSegue 中将该日期推送到添加条目

4) 使用传入的日期填充 DatePicker

我的部分标题目前是:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
    UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 10)];
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor whiteColor];
    label.text = [sectionInfo name];
    return label;


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

    return [[[self.fetchedResultsController sections] objectAtIndex:section] name];

我的 NSFetchedResultsController 方法是:

- (NSFetchedResultsController *)fetchedResultsController

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    if (_fetchedResultsController != nil)
    
        return _fetchedResultsController;
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dates.dateOfEvent" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
    fetchRequest.fetchBatchSize = 20;
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"occasion = %@", self.occasion];
    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"sectionDateFormatter" cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;

sectionNameKeyPath 位于 Transaction NSManagedObject 子类中,它将日期从日期选择器转换为字符串:

-(NSString *)sectionDateFormatter

    return [NSDateFormatter localizedStringFromDate:self.dates.dateOfEvent
                                          dateStyle:NSDateFormatterLongStyle
                                          timeStyle:NSDateFormatterNoStyle];

因此,如上所述,我需要达到 1 - 4。首先是获取顶部第一部分中的任何日期(字符串),将其转换为日期并将其传递。

这看起来很简单,但我对编程还很陌生,任何指导都可以通过一些示例代码来实现这一点。

【问题讨论】:

self.dates.dateOfEventNSDate 的类型吗?尝试将self.selectedDate 格式化为Locale 那么,当您尝试使用selectedDate 时,它是什么?设置的时候是什么?你做了什么来调试这个? 感谢 Akhilrajtr 和 @HotLicks 的回答 - 我已经更新了问题,以包括我现在知道的我需要实现的目标。我没有关于实现这一目标的第一条线索 - 你对此有什么想法吗? NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0] ; NSString *sectionTitle = [tableviewObj tableView:tableViewObj titleForHeaderInSection:indexPath.section]; 【参考方案1】:

如你所说

1分答案是

获取章节标题

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0] ;
NSString *sectionTitle = [tableviewObj tableView:tableViewObj titleForHeaderInSection:indexPath.section];

4分答案是

UIPickerView 中有一个方法

- (void)setDate:(NSDate *)date animated:(BOOL)animated;

【讨论】:

嗨@Ram - 这真的很棒,非常感谢您的回复。第一点就像一个魅力,我现在有了日期字符串 - 你有什么好的例子来做第二个,把它转换成日期? @Lavanya,您使用的原因很好。如果您在这方面遇到问题,我可以为您提供帮助。 感谢您的消息 - 我大部分时间都在工作。我可以将表格视图中的日期传递到添加条目屏幕;这样可行。但我只是对将 setDate 方法放在哪里感到困惑。如果我将它放在 viewDidAppear 中,则在从该应用程序的其他位置激活此添加条目时会崩溃。我需要把它放在一个只能从表视图调用而不是在 viewDidLoad 中调用的地方。有什么想法吗? 所以基本上 - 这个添加条目是从应用程序的所有部分调用的。如果从任何地方调用它,我希望它保持与现在相同(显示当前日期) - 无需更改。但是,如果它是从这个特定的表视图中调用的,我想添加那个 setDate 代码。我有 prepareForSegue 工作,但我如何指定从这个特定的表视图调用? 能否提供一点代码,让我看清楚

以上是关于使用导航栏按钮项和核心数据在视图控制器之间传递日期的主要内容,如果未能解决你的问题,请参考以下文章

如何使用转场

向 UItableview 添加行并在 Viewcontroller 之间传递数据

Swift - 在视图控制器之间传递数据

如何将数据从视图控制器传递到标签栏控制器以及导航控制器?

在 TabBarController 中的选项卡之间切换/导航

使用swift在选项卡式视图中的导航栏上添加按钮