0

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

Однако, одна из вещей, которые я хочу, чтобы мой подкласс удерживался, является ссылкой на объект 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 

Как вы можете видеть, он имеет переменную экземпляра в NSMangedobject я хочу его держать (а также контекст). Но для моей жизни я не могу заставить ее удерживать 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 

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

+0

Не имеет отношения к вопросу, но на самом деле вам не нужно иметь свойство для 'NSManagedObjectContext' - вы можете просто использовать свойство' managedObjectContext' объекта 'player'. – shosti

ответ

2

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

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

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

+0

Я пытался выяснить, как это сделать, когда я наконец решил, что могу использовать атрибут Tag на кнопках, чтобы отслеживать их. Благодаря! –

1

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

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

+1 Это хороший способ найти предполагаемую ошибку за пределы. – TechZen

0

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

[[NSApp delegate] managedObjectContext]; 

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

[[[NSApp delegate] managedObjectModel] entities]; 

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

Смежные вопросы