为另一个对象提供NSManagedObject

时间:2010-06-01 13:28:29

标签: objective-c iphone-sdk-3.0 uibutton subclass nsmanagedobject

好吧,所以我的代码遇到了问题。我所做的是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

正如你所看到的,它有一个NSMangedobject的实例变量我希望它保持(以及Context)。但对于我的生活,我无法得到它来持有NSManagedObject。我在Implementation文件中运行了两个@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)并且控制台输出停止。它没有给我任何错误,并且通知应用程序崩溃了。它只是...停止。所以我甚至不知道崩溃代码的错误是什么,除了它与设置“播放器”变量的那一行有关。思想和想法?我爱你的智慧!

3 个答案:

答案 0 :(得分:2)

没有特别的理由说明您的代码不应该起作用。您可以将NSManageObject实例指定为属性。崩溃的最简单解释是数组的超出界限错误。当你没有从控制台收到错误时,通常是因为调试器崩溃了。这通常是由于某种递归导致调试器堆栈溢出引起的。

但是,将数据逻辑放在像按钮这样的视图元素中是非常非常糟糕的做法。这完全打破了MVC设计模式,并使您的代码易碎且难以维护。 UI元素应该是“哑”并且只能理解如何显示传递给他们的任何数据,他们不应该参与实际跟踪数据本身。这分别是控制器和数据模型的功能。

理想情况下,应该通过数据模型跟踪“播放器”对象,然后控制器链接到相应的UI按钮或 其他UI元素。 进行跟踪数据模型中的播放器使设计更加灵活,易于扩展,重用和维护。

答案 1 :(得分: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

这可能会揭示错误

答案 2 :(得分:0)

您只能通过将其声明为属性并添加@synthesize来创建托管对象上下文。托管对象上下文由应用程序委托创建,您可以这样调用它:

[[NSApp delegate] managedObjectContext];

我不知道你如何初始化player数组,但我怀疑它不包含你认为它做的对象:NSManagedObjectContext只有返回NSSet的方法,而

[[[NSApp delegate] managedObjectModel] entities];

确实返回一个数组,它包含NSEntityDescription的实例。我建议您首先查看应用程序的应用程序委托代码(AppDelegate.m),以了解有关Core Data存储的入口点的更多信息。