0

我是初学者,我正在尝试将我的应用程序移至 Core Data。我正在关注 Big Nerd Ranch 第 3 版书,但在那本书中,他们有一个商店类,其中包含一个项目类中的所有项目。我的应用程序不同。我有一个任务类,任务显示在 TableView 控制器中声明的任务数组中,如果你点击一个任务,它的详细信息会出现在一个详细视图控制器中。问题是,书上说我需要创建一个 NSManagedObjectContext、NSManagedObjectModel 和一个 NSPersistentStoreCoordinator,它们在商店中完成。我将在我的应用程序中在哪里声明这些?TableView 控制器还是详细视图控制器?这是我的代码:

任务.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

任务.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

表视图控制器.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];
}

详细视图控制器.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;
}
4

2 回答 2

0

您应该在文件中声明NSManagedObjectContextNSManagedObjectModel和 an 。NSPersistentStoreCoordinatorAppDelgate.h

所有这三个对象大多需要在应用程序中只分配一次内存。
您需要NSManagedObjectContext在整个应用程序中保存/编辑/检索托管对象。

我的建议:新建一个项目,选择Master- Detail Application模板。检查Use Core data选项。

AppDelegate.h您将在这个新应用程序的文件中获得有关 Core Data 的所有模板代码AppDelegate.m,您可以将其复制/粘贴到您的应用程序中。

于 2013-07-24T05:34:38.630 回答
0

它们都是在 appDelegate 类中创建的。当您创建项目时,您选择核心数据选项和模型,并且为您创建所有 NSManagedObjectContext、NSManagedObjectModel 和 NSPersistentStoreCoordinator。它们是全球性的,您可以通过以下方式在任何地方访问它们:


[[UIApplication sharedApplication]delegate]


于 2013-07-24T05:38:09.283 回答