为啥我的 newObject 方法没有被调用?
Posted
技术标签:
【中文标题】为啥我的 newObject 方法没有被调用?【英文标题】:Why is my newObject method not called?为什么我的 newObject 方法没有被调用? 【发布时间】:2012-02-26 03:51:57 【问题描述】:我正在关注 Aaron Hillegass 的 Cocoa 书中的一个练习 - 关于核心数据的章节。我有一个基于文档的应用程序,它将汽车数据保存到数组控制器中,然后它使用绑定......问题是我有一个日期选择器,我想尽快将它初始化为今天的日期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 中的 Array Controller,“准备内容”按钮被选中,所以 automaticallyPreparesContent
应该设置为 YES
...?
【问题讨论】:
您是否为阵列控制器设置了类名/实体名? 糟糕,已修复,谢谢。大问题还在。 :-( @JoshCaswell,对于数组控制器,在 MyDocument.xib 中,我设置了模式:实体名称,实体名称:汽车(即我的 .xcdata... 文件中的实体名称) 【参考方案1】:我认为 Xcode 4.2 中存在错误,bignerdranch 的论坛中有一个帖子:http://forums.bignerdranch.com/viewtopic.php?f=183&t=3465
不知何故,Xcode 没有意识到我将数组控制器更改为我的自定义类。为了让它工作,我首先添加了 initWithcoder 方法,然后归档了应用程序,然后返回并删除了 initWithCoder 方法(回到我原来的代码),现在它工作了!上面线程中的人提出了其他没有意义的解决方案……我认为这是一个错误……
【讨论】:
【参考方案2】:作为对 janehouse 的 answer 的补充,我在同一本书中遇到了同样的问题,尽管在后来的第五版中使用了 Swift。通过阅读该论坛链接,我发现了来自 riceboy 的这篇文章对我有用:
我认为这是一个错误。
就我而言,我遇到了同样的问题。我所做的是:
1 - 在“带步进器的文本日期选择器”>“值”选项卡上,我取消选中了“绑定到汽车”复选框。 2 - CMD+Shift+K 清理项目 3 - CMD+Shift+B 构建项目 4 - 运行并关闭它 5 - 返回“带步进器的文本日期选择器”>“值”选项卡,我选中了“绑定到汽车”复选框。 6 - 重复第 2 步到第 4 步,然后就成功了……
确保您的“汽车”控制器的类设置为
CarArrayController
我只能假设因为我们在将 NSArrayController
实例设置为子类 CarArrayController
之前创建了绑定,所以这些更改不会传播到原始绑定。
【讨论】:
【参考方案3】:要为核心数据实体的新实例设置默认值,最好在托管对象子类中覆盖awakeFromInsert
。而是在那里设置默认值。
至于为什么没有调用您的覆盖方法,我只能假设您已经创建了 NSArrayController 的子类但不知何故没有使用它?如果你记录它,控制器如何显示?
【讨论】:
在我的 .xib 文件中,我有一个阵列控制器的实例。我检查了一下,它的自定义类设置为 CarArrayController ......所以我必须使用它?接下来,我向 CarArrayController 添加了一个带有日志的init
方法,根本不调用 init
......别介意 newObject
。为什么?是不是用标准的init
?...
当对象在xib中归档时,会调用initWithCoder:
和awakeFromNib
方法。
好的,它现在可以工作了——我添加了 initWithCoder,谢谢。 (他们也需要在书中修复它!)
我说得太早了,日期问题解决了,但是当我启动程序时,我的初始值是空白的,并且应该显示初始值“$0.0”价格的数字格式化程序被忽略。 .. 回到绘图板...以上是关于为啥我的 newObject 方法没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?
为啥我的方法在 iPhone/iPod 上被调用了两次,但在 iPad 上却没有?