为啥我的 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 方法调用没有被模拟?

Object在其子类中,为啥不能调用clone()???

为啥我的方法在 iPhone/iPod 上被调用了两次,但在 iPad 上却没有?

为啥我的 SecurityWebFilterChain 没有被调用?

为啥我的构造函数没有被调用?

为啥我的 graphql apollo 解析器没有被调用?