Передача ManagedObjectContext к второму представлению

Вот вариант ответа от Nux, который работает для меня:

def WriteDirectoryToZipFile( zipHandle, srcPath, zipLocalPath = "", zipOperation = zipfile.ZIP_DEFLATED ):
    basePath = os.path.split( srcPath )[ 0 ]
    for root, dirs, files in os.walk( srcPath ):
        p = os.path.join( zipLocalPath, root [ ( len( basePath ) + 1 ) : ] )
        # add dir
        zipHandle.write( root, p, zipOperation )
        # add files
        for f in files:
            filePath = os.path.join( root, f )
            fileInZipPath = os.path.join( p, f )
            zipHandle.write( filePath, fileInZipPath, zipOperation )
8
задан amo 2 July 2009 в 14:32
поделиться

8 ответов

О, это интересно. Я потратил некоторое время на трассировку стека и думаю, что у меня это получилось.

Итак, pushViewController вызывает viewDidLoad не один раз, а дважды . При первом вызове viewDidLoad объекты не создаются должным образом. Во второй раз да. Таким образом, при первом запуске этого кода он не может получить доступ к managedObjectContext и выдает исключение. Во второй раз все нормально. Нет сбоев.

Есть много ссылок на проблемы с многократным выполнением viewDidLoad в Google, поэтому я думаю, что решение состоит в том, чтобы не выполнять эту инициализацию запроса на выборку в viewDidLoad.

7
ответ дан 5 December 2019 в 06:54
поделиться

Вы уверены, что существует сущность под названием "SecondEntity"? (Это был бы простой способ интерпретировать сообщение об ошибке.)

Однако, если это взаимодействие типа «главный список -> подробное представление», я бы предложил передать выбранный объект непосредственно второму контроллеру представления, а не передавать его просто "имя". Предположительно, этот объект содержит все, что вам нужно для заполнения второй таблицы напрямую через его свойства.

Таким образом, вы фактически не будете выполнять явную выборку во втором контроллере представления. То есть:

@interface SecondViewController : UITableViewController
@property (nonatomic, retain) NSManagedObject *selectedObject;
@end

@implementation SecondViewController
- (void)viewDidLoad
{
    NSMutableArray *stuff = [[[selectedObject valueForKey:@"aToManyRelationship"] allObjects] mutableCopy];
    // sort stuff the way you want to display them, etc.
}
...
0
ответ дан 5 December 2019 в 06:54
поделиться

Просто для удовольствия .. попробуйте заменить:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"SecondEntity" inManagedObjectContext:managedObjectContext]; 

на:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"SecondEntity" inManagedObjectContext:[self managedObjectContext]]; 

Вы устанавливаете managedObjectContext через сеттер, а затем пытаетесь получить доступ к ivar напрямую. В зависимости от того, как определены ваши свойства, это может быть неверно. [self managedObjectContext] попытается получить доступ к значению через геттер, а не напрямую.

0
ответ дан 5 December 2019 в 06:54
поделиться

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

Короче говоря, вы пытаетесь получить сущность из объектного контекста, который еще не был настроен. Поэтому вы можете настроить его прямо сейчас или в другом месте приложения до загрузки этого представления.

Если ваше приложение настроено как демонстрация приложения CoreDataBooks из центра разработки iphone с основным UIApplicationDelegate, также управляющим стеком CoreData, тогда вы должны иметь возможность делать следующее:

if (managedObjectContext == nil) { managedObjectContext = [[[UIApplication sharedApplication] делегат] managedObjectContext]; }

Это должно сработать.

1
ответ дан 5 December 2019 в 06:54
поделиться

Одно можно сказать наверняка, строка: secondViewController.managedObjectContext = [self managedObjectContext];

Должно быть: secondViewController.managedObjectContext = self.managedObjectContext;

Если текущий объект не реализует метод под названием «managedObjectContext», который возвращает эту переменную.

-2
ответ дан 5 December 2019 в 06:54
поделиться

Это может быть проблемой.

краткий ответ: удалите приложение, затем запустите его снова.

длинный ответ:

Если вы соберете и запустите свой проект, CoreData сохранит вашу модель туда, куда вы сказали (постоянное местоположение хранилища).

Если вы измените что-то в модели CoreData, при повторном запуске приложения новая модель не будет соответствовать сохраненной модели, что приведет к ошибке.

Чтобы исправить это удалите ваше приложение. Это позволит избавиться от сохраненной модели, и при повторном запуске она воссоздает вашу новую модель.

-1
ответ дан 5 December 2019 в 06:54
поделиться

Вы можете подавить предупреждение «-managedObjectContext», не найденное в протоколах, сначала приведя делегата вашего приложения:

if (managedObjectContext == nil) { managedObjectContext = [(MyAppDelegateName *)[[UIApplication sharedApplication] delegate] managedObjectContext]; }
18
ответ дан 5 December 2019 в 06:54
поделиться

У меня возникла эта проблема, и я обнаружил, что сообщение инициализации моего объекта обращалось к managedObjectContext до вызова setManagedObjectContext ...

До:

 dataController = [[DataController alloc] init];
 [dataController setManagedObjectContext:[self managedObjectContext]];

После:

 dataController = [DataController alloc];
 [dataController setManagedObjectContext:[self managedObjectContext]];            
 [dataController init];

feh. Ошибка новичка.

0
ответ дан 5 December 2019 в 06:54
поделиться