@ermolushka

Как реализовать relationship в Core Data?

Добрый день. Я сейчас работаю над приложением, в котором есть несколько экранов. Итак, по порядку:

1. На первом экране есть несколько кнопок (English, Spanish, Chinese), при нажатии на которые переходит на второй экран. Предположим, нажали на English.

2. На втором экране обычный table view со списком уроков, которые пользователь создал. Также в nav bar-е кнопка "Добавить" для добавления нового урока.

3. При нажатии на ячейку в таблице переходит на следующий экран, где есть коллекция карточек, реализованных с помощью UIScrollView (в процессе реализации). Сверху в nav bar-е также есть кнопка добавить для добавления новой карточки.

Внимание вопрос: как сделать так, чтобы карточка добавилась именно для этого урока? На данный момент у меня получается так, что при добавлении, она добавляется во все уроки, а мне нужно конкретно в этот.

Код table view для отображения списка уроков (EnglishTablewViewController.m)

@implementation EnglishTableViewController


-(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];
    
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"EnglishCourse"];
    self.cources = [[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 [self.cources count];
}


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

    NSManagedObject *course = [self.cources objectAtIndex:indexPath.row];
    [cell.textLabel setText:[NSString stringWithFormat:@"%@", [course valueForKey:@"name"]]];
    return cell;
 
}



- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObjectContext *context = [self managedObjectContext];
    
    if (editingStyle == UITableViewCellEditingStyleDelete){
        [context deleteObject:[self.cources objectAtIndex:indexPath.row]];
        
        NSError *error = nil;
        if(![context save:&error]){
            NSLog(@"Не удалилось! %@ %@", error, [error localizedDescription]);
            return;
        }
        
        [self.cources removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}


Код для добавления нового урока в таблицу (AddEnglishCourseViewController.m):

@implementation AddEnglishCourseViewController


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

- (void)viewDidLoad {
    [super viewDidLoad];
    
}



- (IBAction)save:(id)sender {
    NSManagedObjectContext *context = [self managedObjectContext];
    
    NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"EnglishCourse" inManagedObjectContext:context];
    [newDevice setValue:self.nameTextField.text forKey:@"name"];
     
    NSError *error = nil;
    if(![context save:&error]){
        NSLog(@"Can't save! %@ %@", error, [error localizedDescription]);
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}


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

}
@end


Storyboard

По аналогии хочу сделать и с добавлением карточки в урок, но написав такой же код, карточка добавится во все уроки в таблице.
  • Вопрос задан
  • 2646 просмотров
Пригласить эксперта
Ответы на вопрос 2
ManWithBear
@ManWithBear
Swift Adept, Prague
Если я правильно понял, то вы планируете добавить для каждого языка по 2 вью контроллера (список и добавление)? Если да, то у вас проблемы в архитектуре.
Работу с CoreData'ой имеет смысл выделить в синглетон. И каждому элементу добавить поле "язык", который будет содержать к какому языку эта карточка относится.
И в зависимости от выбранного языка ваши контроллеры будут показывать только элементы, у которых в поле "язык" будет необходимый вам.
Ответ написан
@mr_cloud
iOS Developer
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы