我正在跟随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
...?
答案 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的子类但是不知道怎么没用它?如果您记录它,控制器如何显示?