0

これは非常に初心者の質問であり、これは私が以前に何度も行ったことですが、今回は欠けていることがあります。

AppDelegate.hファイルで、NSArrayを宣言し、プロパティとして設定します。

@interface AppDelegate : NSObject {
NSArray *lines;

}

@property(readwrite, retain) NSArray *lines;
@end

次に、awakeFromNibメソッドのAppDelegate.mファイルで、次のように割り当てます。

lines = [[NSArray alloc] init];

次に、lines配列を設定するメソッドがあります。

NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL];
lines = [fileContents componentsSeparatedByString:@"\n"];

にバインドされた配列コントローラーがあり、AppDelegate.self.lines次ににバインドされたテーブル列がありますArray Controller.arrangedObjects。配列が更新されている(NSLogを使用してテストされている)ことを確認できますが、テーブルの内容は更新されていません(空白のままです)。

私がここで見逃している明らかな何かがありますか?

4

3 に答える 3

4

バインディングを使用している場合は、データソースは必要ありません。どちらか一方。

「AppDelegate.self.lines」にバインドされたアレイコントローラーがあります…</p>

なぜselfですか?

@property(readwrite、retain)NSArray * lines;

いいえ、copyここで使用してください。そうしないと、他の誰かの変更可能な配列を保持していることに気付くでしょう。その後、その配列は変更されます。そうすると、「あなたの」配列はあなたが知らないうちに変わってしまうでしょう。

次に、lines配列を設定するメソッドがあります。

lines = [fileContents componentsSeparatedByString:@"\n"];

これが、テーブルに何も表示されない理由です。プロパティを通過するのではなく、インスタンス変数に直接アクセスします。インスタンス変数に直接アクセスしてもKVO通知は発生しないため、アレイコントローラーは変更を認識しません。

さらに悪いことに、古いアレイをリークし(リリースせずに単に割り当てたため)、この新しいアレイを十分に保持していません。新しい配列を保持していないため、そのインスタンス変数はまもなくデッドオブジェクトを保持します。自動保持はメソッドによって実行されますsetLines:。メソッドは、呼び出したときにのみ呼び出されます。

あなたはプロパティを通過する必要があります:

self.lines = [fileContents componentsSeparatedByString:@"\n"];

プロパティアクセスは暗黙のアクセサメッセージであるため、これは配列を保持し(または、上記で提案したように修正すると、配列をコピーします@property)、KVO通知を送信します。

于 2009-08-26T20:02:51.330 に答える
2

列にバインドされたarrangedObjectsがあると言うとき、それはtablviewデータソースを設定することを意味しますか?そうでない場合は、テーブルビューデータソースをlines配列に設定します

于 2009-08-26T18:08:35.367 に答える
0

あなたはこれを読みたいかもしれません、それはいくつかの良い図と説明を持っています。ennuikillerが言っていることは正しいです、私はそれがあなたのデータソースの問題だと思います。これは、

[aTable setDelegate:aDelegate];
于 2009-08-26T18:14:48.223 に答える