2

我是 Objective-C 的完全新手,来自 PHP 的背景,各种 BASIC 方言,以及少量的 C/C++。虽然我觉得我在 Interface Builder 中设置基本窗口方面做得很好,但是,我在操作文本字段的内容时遇到了麻烦,尤其是从它们调用值并向它们发送值。

我正在使用没有额外功能的基本 Xcode Cocoa 应用程序模板,并创建了一个名为“controller.h”的 Cocoa 类。在 Interface Builder 中,我将一个带有 Secure Text 字段的窗口、一个基本的 NSTextField 和一个用于提交表单的按钮放在一起。我的控制器类是这样的:

//controller.h
#import <Cocoa/Cocoa.h>

@interface controller {
    IBOutlet id userInput;
    IBOutlet id userOutput;
}
- (IBAction)submitButton:(id)sender;
@end

//controller.m
#import "controller.h"

@implementation controller
- (IBAction)submitButton:(id)sender {
    NSBeep();
    [userOutput setStringValue: userInput];
    [userInput setStringValue:nil];
}
@end

我将 userInput 链接到 Secure Text 字段,并将 userOutput 链接到 NSTextField。submitButton 链接到 Push Button。根据我对工作原理的理解,这应该将 userInput 中安全文本的值分配给 userOutput,从而更新 NSTextField 中显示的内容,然后重置该字段。蜂鸣声是为了让我知道是否正在调用该函数。

然而,哔声没有响起,这意味着什么都没有发生。不过,Interface Builder 构建了这些文件,所以我知道它们已正确定义并连接到正确的位置。如何修复它以便执行 IBAction 并将值发送到需要的位置?

4

1 回答 1

1

查看它是否被调用的更有效方法是设置断点(双击编辑器左侧的装订线)并调试应用程序。第一个建议始终是健全地检查您的连接。

此外,您可能希望改用这一行:

[userOutput setStringValue:[userInput stringValue]];

(请注意,它是从NSControl-stringValue继承的,就像是一样。)-setStringValue:


编辑:这可能有助于确保您实际上正在实例化控制器对象。您可以向控制器添加一个-awakeFromNib方法并在其中放置一个断点以查看是否是这种情况。(请参阅http://www.cocoadev.com/index.pl?AwakeFromNib)如果没有调用该方法,则也不会建立 IB 中指定的连接。

于 2009-11-21T08:02:41.177 回答