【问题标题】: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... 文件中的实体名称)

标签: cocoa core-data nsarraycontroller


【解决方案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”价格的数字格式化程序被忽略。 .. 回到绘图板...
      猜你喜欢
      • 1970-01-01
      • 2017-12-07
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多