Получение ошибки в проекте пробных данных ядра

Я узнал о основных данных из: http://www.appcoda.com/introduction-to-core-data/, но когда я сам разработал образец проекта, многие ошибки возникают в двух файлах. Любая помощь будет оценена по мере того, как я новичок в разработке iPhone.

    //
//  PupilViewController.m
//  Pupils
//
//  Created by Lukasz Mozdzen on 21.04.2013.
//  Copyright (c) 2013 Lukasz Mozdzen. All rights reserved.
//

#import "PupilViewController.h"

@interface PupilViewController ()
@property (strong) NSMutableArray *pupils;

@end

@implementation PupilViewController


- (NSManagedObjectContext *)managedObjectContext
{
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}


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

    // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Pupil"];
    self.pupils = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

    [self.tableView reloadData];
}



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return self.pupils.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    NSManagedObject *pupil = [self.pupils objectAtIndex:indexPath.row];
    [cell.textLabel setText:[NSString stringWithFormat:@"%@ %@", [pupil valueForKey:@"name"], [pupil valueForKey:@"surname"]]];
    [cell.detailTextLabel setText:[pupil valueForKey:@"telephone"]];

    return cell;
}



@end

Журнал ошибок:

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:36:5: Use of undeclared identifier 'NSFetchRequest'

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:36:21: Use of undeclared identifier 'fetchRequest'

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:36:38: Use of undeclared identifier 'NSFetchRequest'

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:37:62: Use of undeclared identifier 'fetchRequest'

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:62:5: Unknown type name 'NSManagedObject'; did you mean 'NSManagedObjectModel'?

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:63:67: Receiver type 'NSManagedObjectModel' for instance message is a forward declaration

/Users/Lukasz/Desktop/Pupils/Pupils/PupilViewController.m:64:36: Receiver type 'NSManagedObjectModel' for instance message is a forward declaration

Также в другом файле:

//
//  PupilDetailViewController.m
//  Pupils
//
//  Created by Lukasz Mozdzen on 21.04.2013.
//  Copyright (c) 2013 Lukasz Mozdzen. All rights reserved.
//

#import "PupilDetailViewController.h"

@interface PupilDetailViewController ()

@end

@implementation PupilDetailViewController


- (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}




- (IBAction)cancel:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)save:(id)sender {
    NSManagedObjectContext *context = [self managedObjectContext];

    // Create a new managed object
    NSManagedObject *newPupil = [NSEntityDescription insertNewObjectForEntityForName:@"Pupil" inManagedObjectContext:context];
    [newPupil setValue:self.nameTextField.text forKey:@"name"];
    [newPupil setValue:self.surnameTextField.text forKey:@"surname"];
    [newPupil setValue:self.telephoneTextField.text forKey:@"telephone"];

    NSError *error = nil;
    // Save the object to persistent store
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

Журнал ошибок:

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:38:5: Unknown type name 'NSManagedObject'; did you mean 'NSManagedObjectModel'?

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:38:34: Use of undeclared identifier 'NSEntityDescription'; did you mean 'kSecAttrDescription'?

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:38:34: Bad receiver type 'CFTypeRef' (aka 'const void *')

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:39:6: Receiver type 'NSManagedObjectModel' for instance message is a forward declaration

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:40:6: Receiver type 'NSManagedObjectModel' for instance message is a forward declaration

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:41:6: Receiver type 'NSManagedObjectModel' for instance message is a forward declaration

/Users/Lukasz/Desktop/Pupils/PupilDetailViewController.m:45:11: Receiver type 'NSManagedObjectContext' for instance message is a forward declaration

Любой может помочь?

Ответ 1

Вам нужно добавить Framework для coredata в свой комплект, прежде чем использовать то же самое.

Как вы сказали, вы новичок в разработке iPhone, я предлагаю вам обратиться к apple docs на coredata перед его внедрением.

Ответ 2

В дополнение к добавлению структуры Core Data в параметры проекта, вы должны #import <CoreData/CoreData.h> в своем исходном коде. Вы можете сделать это только один раз для всего проекта, поместив #import в .pch файл для своего проекта, обычно находящийся в группе "Поддерживаемые файлы" вашего дерева проектов.

Ответ 3

Проблема в том, что прошло некоторое время с тех пор, и после iOS 10 ManagedObjectContext был перемещен в PersistentContainer внутри атрибута viewContext. Вот почему вам нужно немного изменить фрагмент кода из AppCoda, чтобы он вызывал контекст #

-(NSManagedObjectContext *)managedObjectContext{

    NSManagedObjectContext *context = nil;
    id delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    // call "persistentContainer" not "managedObjectContext"
    if( [delegate performSelector:@selector(persistentContainer)] ){
        // call viewContext from persistentContainer not "managedObjectContext"
        context = [[delegate persistentContainer] viewContext];
    }

    return context;
}

Ответ 4

import CoreData

в "AppDelegate" и в "соответствующих контроллерах представлений" разрешили подобные проблемы для меня. Я добавил CoreData в существующий проект, и поэтому этот автоматический механизм импорта CoreData был пропущен.

Протестировано с помощью Swift 3