0

2 つの NIB を備えたコア データ アプリケーション、NSTableView のペアを備えたメイン ウィンドウ、およびコンテンツを追加するためのフォームがあります。フォームには NSTextView と NSTextField があります。コア データに 2 つのエンティティがあり、2 つの NSArrayController でコンテンツを管理します。1 つの NSArrayController を使用すると、AppDelegate の次のコードでコンテンツを追加できます。

    id o = [bookController newObject];
    [o setValue:@"Drafts" forKey:@"bookName"];
    [o setValue:0 forKey:@"sortOrder"];
    [bookController addObject:o];

しかし、私の AppController クラスのこのコードは常に null を返します。

NSObject *o = [chapterArrayController newObject];

[o setValue:contentOfchapter forKey:@"chapterText"];
[o setValue:chapterTitleString forKey:@"chapterTitle"];
[o setValue:@"Drafts" forKey:@"bookChapter"];
NSLog(@"Where is the object?: %@", o);
[chapterArrayController addObject:o];

chapterArrayController がコア データの Chapter エンティティに接続されていないようですが、IB のバインディングは正しいです。これは複数のペン先と関係があると思いますが、ここでちょっと途方に暮れています。

正しい方向へのポインタは高く評価されます。

ありがとう。

更新 2: 次のような JBAddChapter という名前のクラスを作成しました。

JBAddChapter.h

#import <Cocoa/Cocoa.h>


@interface JBAddChapter : NSObject {

IBOutlet NSArrayController *bookController;
IBOutlet NSArrayController *chapterArrayController;

}
- (IBAction)testArrayControllers:(id)sender;
+ (void)getChapterData:(NSString *)passedChapterTitle withChapterText:(NSString *)passedChapterText;
- (void)standAloneTestArrayControllers;

@end

JBAddChapter.m

#import "JBAddChapter.h"


@implementation JBAddChapter


+ (void)getChapterData:(NSString *)passedChapterTitle withChapterText:(NSString *)passedChapterText;
{
    [[self alloc] standAloneTestArrayControllers];
}


- (IBAction)testArrayControllers:(id)sender
{
    [self standAloneTestArrayControllers];
}

- (void)standAloneTestArrayControllers
{
    [chapterArrayController fetchWithRequest:nil merge:NO error:nil];
    NSLog(@"1. chapterArrayController %@", chapterArrayController);

    NSArray *a = [chapterArrayController arrangedObjects];
    NSLog(@"2. NSArray a = %@", a);

    NSUInteger numberOfMenuItems = [a count];
    NSLog(@"3. Count of items in array: %d", numberOfMenuItems);

    [bookController fetchWithRequest:nil merge:NO error:nil];
    NSLog(@"1. bookController %@", chapterArrayController);

    NSArray *b = [chapterArrayController arrangedObjects];
    NSLog(@"2. NSArray b = %@", b);

    NSUInteger newNumberOfMenuItems = [a count];
    NSLog(@"3. Count of items in array: %d", newNumberOfMenuItems);
}
@end

メイン ウィンドウの IB に 2 つのボタンを作成し、1 つを上記の testArrayControllers IBAction に接続しました。AppController とこの IBAction に接続するもう​​ 1 つのボタン:

- (IBAction)testArrayControllers:(id)sender
{
    [JBAddChapter getChapterData:nil withChapterText:nil];
}

standAloneTestArrayControllersJBAddChapter の IBAction から呼び出すと、すべて正常に動作します。JBAddChapter のファクトリ メソッドを使用して AppController から同じメソッドを呼び出すと、アレイ コントローラは nil になります。

2010-01-07 06:15:36.971 Scout[3881:a0f] 1. chapterArrayController <NSArrayController: 0x200060b40>[entity: Chapter, number of selected objects: 1]
2010-01-07 06:15:36.972 Scout[3881:a0f] 2. NSArray a = (
loads of stuff
)
2010-01-07 06:15:36.973 Scout[3881:a0f] 3. Count of items in array: 9
2010-01-07 06:15:36.974 Scout[3881:a0f] 1. bookController <NSArrayController: 0x200060b40>[entity: Chapter, number of selected objects: 1]
2010-01-07 06:15:36.978 Scout[3881:a0f] 2. NSArray b = (
loads of stuff
)
2010-01-07 06:15:36.979 Scout[3881:a0f] 3. Count of items in array: 8
2010-01-07 06:15:38.402 Scout[3881:a0f] 1. chapterArrayController (null)
2010-01-07 06:15:38.402 Scout[3881:a0f] 2. NSArray a = (null)
2010-01-07 06:15:38.402 Scout[3881:a0f] 3. Count of items in array: 0
2010-01-07 06:15:38.403 Scout[3881:a0f] 1. bookController (null)
2010-01-07 06:15:38.403 Scout[3881:a0f] 2. NSArray b = (null)
2010-01-07 06:15:38.403 Scout[3881:a0f] 3. Count of items in array: 0

では、配列コントローラーが一方のメソッドからは nil を返すのに、もう一方のメソッドからは返さないのはなぜでしょうか? 私が知る限り、IB のすべてのバインディングは正しいです。

4

3 に答える 3

0

ここで私自身の質問に答えると思います。NIBに問題があり、アレイコントローラを削除して、IBで再接続すると、すべてが自動的に再び機能しました。

于 2010-01-07T22:12:16.903 に答える
0

オブジェクトを要求するとき、chapterArrayControllerはnilですか?

2つのペン先があると言います...chapterArrayControllerはその2番目のペン先でインスタンス化されていますか?もしそうなら、newObjectが呼び出されるまでにnibはロードされていますか?

于 2010-01-06T03:52:47.317 に答える
0
于 2010-01-07T13:54:21.983 に答える