Предоставление другому объекту NSManagedObject - PullRequest
0 голосов
/ 01 июня 2010

Хорошо, поэтому я столкнулся с проблемой с моим кодом. То, что я сделал, это подкласс UIButton, так что я могу дать ему больше информации, которая относится к моему коду. Мне удалось создать кнопки, и они прекрасно работают. Capiche.

Однако одна из вещей, которые я хочу сохранить в своем подклассе, - это ссылка на NSMangedObject. У меня есть этот код в моем заголовочном файле:

@interface ButtonSubclass : UIButton {
    NSManagedObjectContext *context;
    NSManagedObject *player;
}

@property (nonatomic, retain) NSManagedObject *player;
@property (nonatomic, retain) NSManagedObjectContext *context;

- (id)initWithFrame:(CGRect)frame andTitle:(NSString*)title;
//- (void)setPlayer:(NSManagedObject *)aPlayer;

@end

Как видите, у него есть переменная экземпляра для объекта NSManged, который я хочу сохранить (а также контекст). Но ради жизни я не могу заставить его удерживать этот NSManagedObject. Я запускаю оба метода @synthesize в файле реализации.

@synthesize context;
@synthesize player;

Так что я не уверен, что делаю не так. Вот как я создаю свою кнопку:

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works

        playerButton.context = self.context; //works
        playerButton.player = [players objectAtIndex:i]; //FAILS

И я ранее инициализировал массив игроков, где я получаю объекты. Еще одна странная вещь заключается в том, что когда приложение попадает в эту точку кода, происходит сбой приложения (woot) и вывод на консоль останавливается . Это не дает мне никакой ошибки, и уведомление вообще, что приложение упало. Это просто ... останавливается. Так что я даже не знаю, в чем заключается ошибка, которая приводит к сбою кода, кроме того, это связано с тем, что строка устанавливает переменную «player». Мысли и идеи? Я буду рад вашей мудрости!

Ответы [ 3 ]

2 голосов
/ 01 июня 2010

Нет особой причины, по которой ваш код не должен работать. Вы можете назначить экземпляр NSManageObject в качестве атрибута. Простейшим объяснением сбоя является ошибка «вне границ» массива. Когда вы не получаете ошибки от консолей, обычно это происходит из-за сбоя отладчика. Обычно это вызвано некоторой рекурсией, которая вызывает переполнение стека отладчика.

Однако помещать логику данных в элемент вида, например, в кнопку, очень и очень плохая практика. Это полностью нарушает шаблон проектирования MVC и сделает ваш код хрупким и сложным в обслуживании. Элементы пользовательского интерфейса должны быть «тупыми» и понимать только то, как отображать любые передаваемые им данные, они не должны участвовать в реальном отслеживании самих данных. Это функция контроллера и модели данных соответственно.

В идеале объект «игрок» должен отслеживаться моделью данных, которую контроллер затем связывает с соответствующей кнопкой пользовательского интерфейса или другим элементом пользовательского интерфейса. Установка отслеживания игрока в модели данных делает дизайн гибким, что позволяет легко расширять, повторно использовать и поддерживать.

1 голос
/ 01 июня 2010

Попробуйте сначала добавить код отладки

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works
playerButton.context = self.context; //works
NSLog(@"total players: %d", players.count);
NSLog(@"players: %@", [players objectAtIndex:i]);
playerButton.player = [players objectAtIndex:i]; //FAILS

это, вероятно, показывает ошибку

0 голосов
/ 02 июня 2010

Вы не можете создать контекст управляемого объекта, просто объявив его свойством и добавив @synthesize. Контекст управляемого объекта создается делегатом приложения, и вы вызываете его так:

[[NSApp delegate] managedObjectContext];

Я понятия не имею, как вы инициализируете массив игроков, но у меня есть подозрение, что он не содержит объекты, которые, как вы думаете, он содержит: NSManagedObjectContext имеет только методы, которые возвращают NSSet, а

[[[NSApp delegate] managedObjectModel] entities];

возвращает массив, он содержит экземпляры NSEntityDescription. Я предлагаю вам начать с просмотра кода делегата приложения (AppDelegate.m), чтобы узнать больше о точках входа в хранилище базовых данных.

...