2012-02-26 26 views
2

私は、Aaron HillegassのCocoaの本のコアデータに関する章の練習に従っています。私は、アレイコントローラに車のデータを保存し、バインディングを使用するドキュメントベースのアプリケーションを持っています...問題は、日付ピッカーがあり、新しい日付になるとすぐに今日の日付に初期化したいのですcarが追加されたので、NSArrayControllerのnewObjectメソッドをサブクラス化しています。しかし、それは常に2/12/1982を示しています! newObjectメソッド内のNSLogは呼び出されません。私(または本)は何ですか?なぜnewObjectメソッドが呼び出されないのですか?

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のmyアレイコントローラの場合、「コンテンツの準備」ボタンがチェックされているので、automaticallyPreparesContentYES ...に設定する必要があります。

+0

アレイコントローラのクラス名/エンティティ名を設定しましたか? –

+0

ありがとう、ありがとう。大きな問題はまだそこにあります。 :-( – janeh

+0

@ JoshCaswell、MyDocument.xibのアレイコントローラーで、モードを設定しました:エンティティ名、エンティティ名:Car(my .xcdata ...ファイル内のエンティティの名前) – janeh

答えて

1

は、bignerdranchのフォーラムでその上のスレッドがあります:http://forums.bignerdranch.com/viewtopic.php?f=183&t=3465

はどういうわけかXcodeは、私は私のカスタムクラスにアレイコントローラを変更することを実現していません。それを動作させるには、最初にinitWithcoderメソッドを追加してから、アプリケーションをアーカイブしてから、元のコードに戻ってinitWithCoderメソッドを削除してから動作します。上のスレッドの人は、意味が分からない他の解決策を提案します...私はそれがバグだと仮定します...

0

コアデータエンティティの新しいインスタンスにデフォルト値を設定するには、管理対象オブジェクトのサブクラスでawakeFromInsertを無効にする方がよいでしょう。代わりにデフォルト値を設定してください。

あなたのオーバーライドされたメソッドが呼び出されていない理由については、私はあなたがNSArrayControllerのサブクラスを作成したと仮定することができますが、何とかそれを使用していないのですか?あなたがログインすると、コントローラはどのように表示されますか?私はXcodeの4.2のバグがあると思い

+0

IN my .xib私はチェックして、カスタムクラスはCarArrayControllerに設定されています...私はそれを使用する必要がありますか?次に、CarArrayControllerに 'init'メソッドを追加しました。なぜなら、標準の 'init'を使用していないのでしょうか... – janeh

+2

オブジェクトがxibにアーカイブされると、' initWithCoder: 'と' awakeFromNib'メソッドが呼び出されます。 – Eimantas

+0

私はinitWithCoderを追加しました。ありがとうございます(彼らも本で修正する必要があります) – janeh

0

janehouseのanswerを補完するために、Swiftを使用する後の第5版。そのフォーラムのリンクを読んで、私は私のために働いていた米軍のポストを見つけました:

私はバグだと思います。

私の場合は同じ問題がありました。私がしたことは:

1 - "テキストの日付ピッカーとステッパー"> "値"タブで、私は "車にバインド"チェックボックスをオフにしました。
2 - プロジェクトをきれいにするCMD + Shiftキー+ K
3 - CMD +プロジェクトをビルドするために+ Bをシフト
4 - それを実行し、それを閉じ
5 - "ステッパー付テキストの日付ピッカー" に戻ります> " 「Value to」タブで、「Bind to Cars」チェックボックスをオンにしました。
6 - ステップ2〜4を繰り返して、それが機能しました...

私は、我々が作成したので、それらの変更にサブクラス化CarArrayControllerにドンを当社NSArrayControllerインスタンスを設定する前に、結合という仮定を作ることができ、コントローラあなたの「カーズ」のクラスはCarArrayController

に設定されていることを確認してくださいオリジナルのバインディングに伝播することはありません。

関連する問題