0

次のコードがあります。

@interface AXWindowController : NSWindowController {
IBOutlet NSTextField *text;
IBOutlet NSTextField *otherText;
}

- (void) setText: (NSString *)input;
- (void) setOtherText;

@end

@implementation AXWindowController

- (void) setText: (NSString *)input
{
    [text setStringValue:input];
}

- (void) setOtherText
{
    [otherText setStringValue:@"nag"];
}

@end

そして、私が実行すると:

1. [controller showWindow:nil];
2. [controller setText:@"lol"];
3. [controller setOtherText];

3 行目は正しく実行されますが、2 行目は何もしません。実際、2 行目と 3 行目の実行中に gdb で text と otherText を見ると、次の結果が得られます。

(gdb) p text
$1 = (NSTextField *) 0x0
(gdb) p otherText
$2 = (NSTextField *) 0x1385d1e0

何が起こっている?入力変数を NSTextField の set 関数に渡すことができませんか? set 関数のパラメータを変更すると NSTextField が null になるのはなぜですか?

4

2 に答える 2

4

これはよく知られている KVC の問題です。

Cocoa が NIB をロードして IB で設計されたアウトレット接続を接続するとき、setter を探します。そのため、読み込み中に NSTextField* オブジェクトを使用してsetText:を呼び出します。あなたのコードはさまざまな種類のオブジェクトを受け入れる準備ができていないため...最初はアウトレットを構成し、2番目は内部テキスト値を設定します...アウトレットはnilのままです。

nil へのすべての呼び出し - 何もしません。

回避策: アウトレット変数名の名前を変更するか、setter/getter メソッドの名前を KVC 表記とは異なる名前に変更します...

于 2009-12-28T23:11:12.320 に答える
1

To get the annoying, obvious responses out of the way, are you sure you've connected that IBOutlet in Interface Builder? When are you trying to set the lines of text--are you doing it in -awakeFromNib?

于 2009-12-28T22:17:47.773 に答える