我是一名初學者,我試圖將我的應用程序移至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;
}
,我會用[UIApplication的sharedApplication]委託]訪問它們? – EvilAegis
您希望在其他視圖控制器中大部分時間使用NSManagedObjectContext對象,並且您可以在模板代碼中看到它是AppDelegate.h中的一個屬性。所以要獲得它的引用,你必須通過使用AppDelegarte * appDelegate = [[UIApplication sharedApplication] delegate]來獲得AppDelegate對象; 然後你想NSManagedObjectContext參考簡單地做,appDelegate.managedObjectContext –
雖然AppDelegate不是一個類... – EvilAegis