从核心数据中获取 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。管理起来并不难。