为什么我的newObject方法没有被调用?

时间:2012-02-26 03:51:57

标签: cocoa core-data nsarraycontroller

我正在跟随Aaron Hillegass的可可书 - 关于核心数据的章节。我有一个基于文档的应用程序,将汽车数据保存到一个数组控制器,然后使用绑定...问题是我有一个日期选择器,我想尽快将它初始化到今天的日期添加了car,所以我们将NSArrayController的newObject方法子类化。但是,它始终显示在2/12/1982!不调用newObject方法中的NSLog。我(或书)失踪了什么?

CarArrayController.h

#import <Foundation/Foundation.h>

@interface CarArrayController : NSArrayController

@end

CarArrayController.m

#import "CarArrayController.h"

@implementation CarArrayController

- (id)init  //this is not called!
{
    self = [super init];
    if (self) {
        NSLog(@"in init");
    }
    return self;
}

-(id)newObject {   // not called either
    id newObj = [super newObject];
    NSDate *now = [NSDate date];
    [newObj setValue:now forKey:@"datePurchased"];
    NSLog(@"yep");
    return newObj;
}

@end

MyDocument.xib

有一个NSArrayController实例,其自定义类名设置为CarArrayController。

PS:对于MYDocument.xib中的我的数组控制器,选中“准备内容”按钮,因此automaticallyPreparesContent应设置为YES ...?

3 个答案:

答案 0 :(得分:1)

我认为Xcode 4.2中存在一个错误,在bignerdranch的论坛中有一个帖子:http://forums.bignerdranch.com/viewtopic.php?f=183&t=3465

不知怎的,Xcode没有意识到我将Array Controller更改为我的自定义类。为了使它工作,我首先添加了initWithcoder方法,然后归档了应用程序,然后返回并删除了initWithCoder方法(回到我的原始代码),现在它可以工作了!上面的帖子中的人提出了其他没有意义的解决方案......我认为这是一个错误...

答案 1 :(得分:1)

为了补充janehouse的answer,我在同一本书中遇到了同样的问题,尽管在后来的第五版中使用了Swift。通过该论坛链接阅读,我发现这篇帖子来自于我认为适合我的年轻人:

  

我认为这是一个错误。

     

就我而言,我遇到了同样的问题。我做的是:

     

1 - on&#34;文本日期选择器与步进器&#34; &GT; &#34;值&#34;选项卡,我取消选中&#34; Bind to Cars&#34;复选框。
  2 - CMD + Shift + K清洁项目
  3 - CMD + Shift + B构建项目
  4 - 运行并关闭它   5 - 返回&#34;文本日期选择器与步进器&#34; &GT; &#34;值&#34;选项卡,我检查了&#34; Bind to Cars&#34;复选框。
  6 - 重复步骤2到4然后它起作用......

     

确保你的&#34;汽车&#34; controller设置为CarArrayController

我只能假设因为我们在将NSArrayController实例设置为子类CarArrayController之前创建了绑定,所以这些更改不会传播到原始绑定。

答案 2 :(得分:0)

要在核心数据实体的新实例上设置默认值,最好覆盖托管对象子类中的awakeFromInsert。而是设置默认值。

至于为什么你的被覆盖的方法没有被调用,我只能假设你已经创建了一个NSArrayController的子类但是不知道怎么没用它?如果您记录它,控制器如何显示?