2015-10-10 54 views
0

確定這個應該很簡單。用於在Xcode中創建應用程序。我有一個視圖。該視圖有兩個表格視圖。即將發生的事件表視圖和expiredEventsTableView。我正在爲核心數據提取數據。該數據具有名稱「event」和nsDate「eventTimeStart」。我想從當前時間「nowDate」分割eventTimeStart NSDate數據。我想在將來顯示expiredEventsTableView和NSDates上的過去數據以顯示在即將發生的EviewsTableView上。我認爲我走在正確的軌道上,但在排序描述符區域出現問題。到目前爲止,我在這兩個tableviews上都有相同的日期。只是不知道如何分隔每個tableview的日期。從核心數據得到2個數組,它們由nsdate分開它們

@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 

回答

0

2個表視圖的替代方法是一個表視圖中的2個部分。如果您希望將每組數據拆分爲多個部分,則這不起作用,但在您發佈的代碼中,您似乎沒有這樣做。

創建一個FRC對於每個部件,以及用於取其FRC表示第1(第二部分),您有FRC和表視圖之間移動時調整indexPaths。這並不是很難管理。

+0

我實際上正在與此做出不同的方向。因爲所有的答案都想把事情分開。 –

0

這條線:

if (upcomingEventsTableView){ 

將始終返回true,因爲你只是測試一個指針存在,不是它實際指向。所以你的委託方法總是將相同的項目返回給兩個表。在每個選項的代碼是目前同反正,但仍...

你真的應該分開你的關注,並有2個視圖控制器,1爲每個表視圖。

您可以使用您實例化兩次,並提供每一個謂語一個類做到這一點。該謂詞允許類找到它應該顯示的數據的子集,在這種情況下它是基於日期的。第一個得到一個謂詞< nowDate和第二個>= nowDate

現在每一個都有自己的FRC實例,它會返回正確的項目爲它顯示,一切都很好區域化的和可重複使用。

+0

我在正確的地方嗎?如果([sortDescriptors earlierDate:nowDate] == sortDescriptors){ NSLog(@「coming」); //創建nsarray在這裏即將推出並應用於tableviewpendingEventsTableView;其他{ }其他{ NSLog(@「expired」); //創建的NSArray即將在這裏和適用於泰伯維expiredEventsTableView } –

+0

你不帶着幾分的數據拆分,你謂詞拆呢。 – Wain

+0

?我想使用類似 - (NSDate的*)earlierDate:(NSDate的*)anotherDate –

相關問題