2013-07-24 63 views
0

我是一名初學者,我試圖將我的應用程序移至Core Data。我遵循Big Nerd Ranch第三版的書,但在那本書中,他們有一個商店類,它將所有商品放在商品類中。我的應用程序不同。我有一個任務類,任務與TableView控制器中聲明的任務數組一起顯示,如果點擊任務,其詳細信息將顯示在Detail View Controller中。問題是,這本書說我需要創建一個NSManagedObjectContext,NSManagedObjectModel和一個NSPersistentStoreCoordinator,它們在商店中做。我在哪裏可以在我的應用中聲明這些內容? TableView控制器或Detail View Controller?這裏是我的代碼:與實施核心數據混淆

Tasks.h

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@interface Tasks : NSManagedObject 

@property (nonatomic) NSDateComponents *conversionInfo; 
@property (nonatomic) NSTimeInterval dateCreated; 
@property (nonatomic) double orderingValue; 
@property (nonatomic, retain) NSString * taskName; 
@property (nonatomic) double timeInterval; 
@property (nonatomic, retain) NSString * timeIntervalString; 
@property (nonatomic, retain) NSManagedObject *assetType; 

@end 

Tasks.m

@implementation Tasks 

@dynamic conversionInfo; 
@dynamic dateCreated; 
@dynamic orderingValue; 
@dynamic taskName; 
@dynamic timeInterval; 
@dynamic timeIntervalString; 
@dynamic assetType; 

-(void)awakeFromFetch{ 
    [super awakeFromFetch]; 
} 
-(void)awakeFromInsert{ 
    [super awakeFromInsert]; 
    NSTimeInterval t = [[NSDate date] timeIntervalSinceReferenceDate]; 
    [self setDateCreated:t]; 
} 
-(NSString *)timeIntervalString{ 
    NSCalendar *sysCalendar = [NSCalendar currentCalendar]; 
    NSDate *date = [NSDate date]; 
    NSDate *date1 = [NSDate dateWithTimeInterval:self.timeInterval sinceDate:date]; 
    unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit; 
    self.conversionInfo = [sysCalendar components:unitFlags fromDate:date toDate:date1 options:0]; 
    if ([self.conversionInfo hour] == 0){ 
     if ([self.conversionInfo minute] == 1) { 
      self.timeIntervalString = [NSString stringWithFormat:@"%d MIN", [self.conversionInfo minute]]; 
     } else { 
      self.timeIntervalString = [NSString stringWithFormat:@"%d MINS", [self.conversionInfo minute]]; 
     } 
    } else if ([self.conversionInfo hour] == 1) { 
     if ([self.conversionInfo minute] == 0){ 
      self.timeIntervalString = [NSString stringWithFormat:@"%d HR", [self.conversionInfo hour]]; 
     } else if ([self.conversionInfo minute] == 1) { 
      self.timeIntervalString = [NSString stringWithFormat:@"%d HR %d MIN", [self.conversionInfo hour], [self.conversionInfo minute]]; 
     } else { 
      self.timeIntervalString = [NSString stringWithFormat:@"%d HR %d MINS", [self.conversionInfo hour], [self.conversionInfo minute]]; 
     } 
    } else { 
     if ([self.conversionInfo minute] == 0) { 
      self.timeIntervalString = [NSString stringWithFormat:@"%d HRS ", [self.conversionInfo hour]]; 
     } else if ([self.conversionInfo minute] == 1){ 
      self.timeIntervalString = [NSString stringWithFormat:@"%d HRS %d MIN", [self.conversionInfo hour], [self.conversionInfo minute]]; 
     } else { 
      self.timeIntervalString = [NSString stringWithFormat:@"%d HRS %d MINS", [self.conversionInfo hour], [self.conversionInfo minute]]; 
     } 
    } 
    return self.timeIntervalString; 
} 
@end 

TableViewController.m

-(NSMutableArray *)taskArray { 
    if (!taskArray) { 
     taskArray = [NSMutableArray array]; 
    } 
    return taskArray; 
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
cellSubclassCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 
    if (!cell) 
     cell = [[cellSubclassCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"]; 

    if([indexPath section] == 0){ 
    cell.textLabel.text = [[[self.taskArray objectAtIndex:[indexPath row]] taskName] uppercaseString]; 

    cell.imageView.image = [UIImage imageNamed:@"unchecked.png"]; 
     cell.imageView.highlightedImage = [UIImage imageNamed:@"uncheckedhighlighted.png"]; 
     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 
     [cell setBackgroundColor:[UIColor colorWithRed:236.0/255 green:240.0/255 blue:241.0/255 alpha:1.0f]]; 
     cell.textLabel.textColor = baseColor; 

     NSString *detailText = [[self.taskArray objectAtIndex:[indexPath row]] timeIntervalString]; 
     cell.detailTextLabel.text = detailText; 
       [[cell detailTextLabel] setFont:[UIFont fontWithName:@"Avenir-Black" size:12]]; 
     [[cell textLabel] setFont:[UIFont fontWithName:@"AvenirNext-DemiBold" size:16]]; 
[cell.contentView setAlpha:1]; 
    } else if ([indexPath section] == 1) { 
    cell.textLabel.text = [[[self.completedArray objectAtIndex:[indexPath row]] taskName] uppercaseString]; 

    cell.imageView.image = [UIImage imageNamed:@"checked.png"]; 
     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 
     [cell setBackgroundColor:[UIColor colorWithRed:236.0/255 green:240.0/255 blue:241.0/255 alpha:1.0f]]; 
     cell.textLabel.textColor = baseColor; 
     NSString *detailText = [[self.completedArray objectAtIndex:[indexPath row]] timeIntervalString]; 
     cell.detailTextLabel.text = detailText; 
     [[cell detailTextLabel] setFont:[UIFont fontWithName:@"Avenir-Black" size:12]]; 
     [[cell textLabel] setFont:[UIFont fontWithName:@"AvenirNext-DemiBold" size:16]]; 
     [cell.contentView setAlpha:0.5]; 
    } 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handlechecking:)]; 
    //cell.contentView 
    [cell.imageView addGestureRecognizer:tap]; 
    cell.imageView.userInteractionEnabled = YES; 
    return cell; 
    } 
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    Tasks *task = [[Tasks alloc]init]; 
    if (indexPath.section == 0){ 
    task.taskName = [[self.taskArray objectAtIndex:[indexPath row]] taskName]; 
     task.timeInterval = [[self.taskArray objectAtIndex:[indexPath row]] timeInterval]; 
    task.dateCreated = [[self.taskArray objectAtIndex:[indexPath row]] dateCreated]; 
    } else if (indexPath.section == 1){ 
     task.taskName = [[self.completedArray objectAtIndex:[indexPath row]] taskName]; 
     task.timeInterval = [[self.completedArray objectAtIndex:[indexPath row]] timeInterval]; 
     task.dateCreated = [[self.completedArray objectAtIndex:[indexPath row]] dateCreated]; 
    } 
    DetailViewController *dvc = [[DetailViewController alloc]init]; 
    [dvc setTestTask:task]; 
    [[self navigationController] pushViewController:dvc animated:YES]; 
} 

詳細查看Controller.m或者

@interface DetailViewController() 

@end 
@implementation DetailViewController 
@synthesize testTask,timer,timerLabel, date1, alertView, components, timeRemaining; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 


    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [_timeLeft setFont:[UIFont fontWithName:@"BebasNeue" size:25]]; 
    } 
-(IBAction)startTimer:(id)sender{ 
    [sender setHidden:YES]; 
    [pauseButton setHidden:NO]; 
    [continueButton setHidden:NO]; 
     gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
     self.date1 = [NSDate dateWithTimeInterval:[testTask timeInterval] sinceDate:[NSDate date]]; 

     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; 
    [timer fire]; 

} 
-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    [timerLabel setFont:[UIFont fontWithName:@"BebasNeue" size:60]]; 
    [[self navigationItem] setTitle:[testTask taskName]]; 
    if (startButton.hidden == NO){ 
     [pauseButton setHidden:YES]; 
     [continueButton setHidden:YES]; 
    } else { 
     [pauseButton setHidden:NO]; 
     [continueButton setHidden:NO]; 
    } 
     timeRemaining = [NSString stringWithFormat:@"%02d:%02d:%02d", [components hour], [components minute], [components second]]; 
    timerLabel.text = timeRemaining; 
    [timerLabel setNeedsDisplay]; 
    [self.view setNeedsDisplay]; 
} 
-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 

    [testTask setTaskName:[testTask taskName]]; 
    [testTask setTimeInterval:[testTask timeInterval]]; 

} 
-(void)timerAction:(NSTimer *)t{ 
    NSDate *now = [NSDate date]; 
    components = [gregorianCalendar components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:now toDate:self.date1 options:0]; 

    timeRemaining = nil; 
    if([now compare:self.date1] == NSOrderedAscending){ 
     timeRemaining = [NSString stringWithFormat:@"%02d:%02d:%02d", [components hour], [components minute], [components second]]; 
     NSLog(@"works %@", timeRemaining); 
    } else { 
     timeRemaining = [NSString stringWithFormat:@"00:00:00"]; 
     [self.timer invalidate]; 
     self.timer = nil; 
     if (self.alertView == NULL){ 
     self.alertView = [[UIAlertView alloc]initWithTitle:[testTask taskName] message:@"Time is up!" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];  
     NSLog(@"ended"); 
     } 
    } 
    timerLabel.text = timeRemaining; 
    [timerLabel setNeedsDisplay]; 
    [self.view setNeedsDisplay]; 
} 
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{ 
    self.alertView = NULL; 
} 

回答

0

您應在AppDelgate.h文件中聲明NSManagedObjectContextNSManagedObjectModelNSPersistentStoreCoordinator

所有這三個對象大多隻需要在應用程序中分配一次。
您需要整個應用程序需要NSManagedObjectContext才能保存/編輯/檢索托管對象。我的建議: 創建一個新項目,選擇Master- Detail Application模板。檢查Use Core data選項。

您將獲得關於此新應用程序的AppDelegate.hAppDelegate.m文件中核心數據的所有模板代碼,您可以在應用程序中複製/粘貼該文件。

+0

,我會用[UIApplication的sharedApplication]委託]訪問它們? – EvilAegis

+0

您希望在其他視圖控制器中大部分時間使用NSManagedObjectContext對象,並且您可以在模板代碼中看到它是AppDelegate.h中的一個屬性。所以要獲得它的引用,你必須通過使用AppDelegarte * appDelegate = [[UIApplication sharedApplication] delegate]來獲得AppDelegate對象; 然後你想NSManagedObjectContext參考簡單地做,appDelegate.managedObjectContext –

+0

雖然AppDelegate不是一個類... – EvilAegis

0

它們都是在appDelegate類中創建的。在創建項目時,選擇核心數據選項和模型,併爲您創建所有NSManagedObjectContext,NSManagedObjectModel和NSPersistentStoreCoordinator。他們是全球您可以通過使用訪問它們的任何地方:


[[UIApplication sharedApplication]delegate]