从核心数据中获取 2 个数组,通过 nsdate 将它们分开
get 2 arrays from core data separate them by nsdate
好的,这个应该很简单。在 Xcode 中创建应用程序。我有一个视图。此视图有两个 table 视图。 comcomingEventsTableView 和 expiredEventsTableView。我正在提取核心数据的数据。此数据的名称为 "event" 和 nsDate "eventTimeStart"。我想要从当前时间 "nowDate" 拆分出 eventTimeStart NSDate 数据。我想在 expiredEventsTableView 和未来的 NSDates 上显示过去的数据,以显示在即将到来的 EventsTableView 上。我认为我走在正确的轨道上,但在我的排序描述符区域遇到了麻烦。到目前为止,我在两个 table 视图上的日期相同。只是不知道如何分隔每个 table 视图的日期。
@interface EventsViewController ()
@property (nonatomic, strong)NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong)NSFetchedResultsController *fetchedResultsController;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIView *contentView;
@end
@implementation EventsViewController
@synthesize upcomingEventsTableView;
@synthesize expiredEventsTableView;
-(NSManagedObjectContext*)managedObjectContext{
return [(AppDelegate*)[[UIApplication sharedApplication]delegate]managedObjectContext];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.upcomingEventsTableView reloadData];
[self.expiredEventsTableView reloadData];
//scrollview stuff
[super viewDidLayoutSubviews];
[self.scrollView layoutIfNeeded];
self.scrollView.contentSize=self.contentView.bounds.size;
NSError *error = nil;
if(![[self fetchedResultsController]performFetch:&error]){
NSLog(@"Error! %@", error);
abort();
}
}
//upcoming & EXPIRED events tableview
-(void)viewWillAppear:(BOOL)animated{
[self.upcomingEventsTableView reloadData];
[self.expiredEventsTableView reloadData];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
if (upcomingEventsTableView){
return 1;
} else {
return 1;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
if (upcomingEventsTableView){
id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
return [sectionInfo numberOfObjects];
}else{
id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
//format the date
-(NSDate *)convertDateToDate:(NSDate *) date
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSDate *nowDate = [[NSDate alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"yyyy-MM-d H:m:s"];
NSString * strdate = [formatter stringFromDate:date];
nowDate = [formatter dateFromString:strdate];
return nowDate;
}
#pragma mark - fetched results controller section
-(NSFetchedResultsController*)fetchedResultsController {
if (_fetchedResultsController != nil){
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSManagedObjectContext *context = [self managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"eventTimeStart" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
fetchRequest.sortDescriptors = sortDescriptors;
if ([sortDescriptors earlierDate: nowDate] == sortDescriptors) {
NSLog(@"upcoming");
//create nsarray upcoming here and apply to tableview upcomingEventsTableView;
}else{
NSLog(@"expired");
//create nsarray upcoming here and apply to tableview expiredEventsTableView
}
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
#pragma Mark - fetched results controller delegates
-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.upcomingEventsTableView beginUpdates];
}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.upcomingEventsTableView endUpdates];
}
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.upcomingEventsTableView; //creating a temporary placeholder;
switch (type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:newIndexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:{
Event *changeEvent = [self.fetchedResultsController objectAtIndexPath:indexPath];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.text = changeEvent.eventName;
break;
}
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
@end
这一行:
if (upcomingEventsTableView){
将始终 return 为真,因为您只是在测试指针是否存在,而不是它实际指向的内容。因此,您的委托方法总是 return 将相同的项目发送给两个 table。无论如何,目前每个选项中的代码都是相同的,但仍然...
你应该真正分开你的关注点并有 2 个视图控制器,每个 table 视图 1 个。
您可以使用一个 class 实例化两次并为每个实例提供一个谓词来执行此操作。该谓词允许 class 找到它应该显示的数据子集,在本例中它是基于日期的。第一个获得谓词 < nowDate
,第二个获得谓词 >= nowDate
.
每个人现在都有自己的 FRC 实例,它将 return 显示正确的项目,并且所有内容都很好地划分和可重复使用。
2 table 视图的替代方法是在一个 table 视图中包含 2 个部分。如果您希望将每组数据分成几个部分,这将不起作用,但在您发布的代码中,您似乎没有这样做。
您为每个部分创建一个 FRC,无论哪个 FRC 代表第 1 部分(第二部分),您必须在 FRC 和 table 视图之间移动时调整 indexPaths。管理起来并不难。
好的,这个应该很简单。在 Xcode 中创建应用程序。我有一个视图。此视图有两个 table 视图。 comcomingEventsTableView 和 expiredEventsTableView。我正在提取核心数据的数据。此数据的名称为 "event" 和 nsDate "eventTimeStart"。我想要从当前时间 "nowDate" 拆分出 eventTimeStart NSDate 数据。我想在 expiredEventsTableView 和未来的 NSDates 上显示过去的数据,以显示在即将到来的 EventsTableView 上。我认为我走在正确的轨道上,但在我的排序描述符区域遇到了麻烦。到目前为止,我在两个 table 视图上的日期相同。只是不知道如何分隔每个 table 视图的日期。
@interface EventsViewController ()
@property (nonatomic, strong)NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong)NSFetchedResultsController *fetchedResultsController;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIView *contentView;
@end
@implementation EventsViewController
@synthesize upcomingEventsTableView;
@synthesize expiredEventsTableView;
-(NSManagedObjectContext*)managedObjectContext{
return [(AppDelegate*)[[UIApplication sharedApplication]delegate]managedObjectContext];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.upcomingEventsTableView reloadData];
[self.expiredEventsTableView reloadData];
//scrollview stuff
[super viewDidLayoutSubviews];
[self.scrollView layoutIfNeeded];
self.scrollView.contentSize=self.contentView.bounds.size;
NSError *error = nil;
if(![[self fetchedResultsController]performFetch:&error]){
NSLog(@"Error! %@", error);
abort();
}
}
//upcoming & EXPIRED events tableview
-(void)viewWillAppear:(BOOL)animated{
[self.upcomingEventsTableView reloadData];
[self.expiredEventsTableView reloadData];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
if (upcomingEventsTableView){
return 1;
} else {
return 1;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
if (upcomingEventsTableView){
id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
return [sectionInfo numberOfObjects];
}else{
id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
//format the date
-(NSDate *)convertDateToDate:(NSDate *) date
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSDate *nowDate = [[NSDate alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"yyyy-MM-d H:m:s"];
NSString * strdate = [formatter stringFromDate:date];
nowDate = [formatter dateFromString:strdate];
return nowDate;
}
#pragma mark - fetched results controller section
-(NSFetchedResultsController*)fetchedResultsController {
if (_fetchedResultsController != nil){
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSManagedObjectContext *context = [self managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"eventTimeStart" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
fetchRequest.sortDescriptors = sortDescriptors;
if ([sortDescriptors earlierDate: nowDate] == sortDescriptors) {
NSLog(@"upcoming");
//create nsarray upcoming here and apply to tableview upcomingEventsTableView;
}else{
NSLog(@"expired");
//create nsarray upcoming here and apply to tableview expiredEventsTableView
}
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
#pragma Mark - fetched results controller delegates
-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.upcomingEventsTableView beginUpdates];
}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.upcomingEventsTableView endUpdates];
}
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.upcomingEventsTableView; //creating a temporary placeholder;
switch (type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:newIndexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:{
Event *changeEvent = [self.fetchedResultsController objectAtIndexPath:indexPath];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.text = changeEvent.eventName;
break;
}
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
@end
这一行:
if (upcomingEventsTableView){
将始终 return 为真,因为您只是在测试指针是否存在,而不是它实际指向的内容。因此,您的委托方法总是 return 将相同的项目发送给两个 table。无论如何,目前每个选项中的代码都是相同的,但仍然...
你应该真正分开你的关注点并有 2 个视图控制器,每个 table 视图 1 个。
您可以使用一个 class 实例化两次并为每个实例提供一个谓词来执行此操作。该谓词允许 class 找到它应该显示的数据子集,在本例中它是基于日期的。第一个获得谓词 < nowDate
,第二个获得谓词 >= nowDate
.
每个人现在都有自己的 FRC 实例,它将 return 显示正确的项目,并且所有内容都很好地划分和可重复使用。
2 table 视图的替代方法是在一个 table 视图中包含 2 个部分。如果您希望将每组数据分成几个部分,这将不起作用,但在您发布的代码中,您似乎没有这样做。
您为每个部分创建一个 FRC,无论哪个 FRC 代表第 1 部分(第二部分),您必须在 FRC 和 table 视图之间移动时调整 indexPaths。管理起来并不难。