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 变为空?

4

2 回答 2

4

这是众所周知的 KVC 问题。

当 Cocoa 加载您的 NIB 以连接在 IB 中设计的 outlets 连接时,它会寻找 setter。因此,它在加载时使用 NSTextField* 对象调用setText :。由于您的代码尚未准备好接受不同类型的对象...首先用于配置插座,其次用于设置其内部文本值...您的插座将保持等于nil

所有对 nil 的调用 - 什么都不做。

解决方法:重命名出口变量名称或重命名 setter/getter 方法以不同于 KVC 表示法...

于 2009-12-28T23:11:12.320 回答
1

为了消除烦人的、明显的响应,你确定你已经在 Interface Builder 中连接了那个 IBOutlet 吗?您何时尝试设置文本行 - 您是否在 -awakeFromNib 中进行设置?

于 2009-12-28T22:17:47.773 回答