设置NSTextField的值

时间:2011-05-14 16:44:57

标签: objective-c cocoa macos

我正在尝试设置NSTextField的值,但它无法正常工作。

我有一个链接到IBAction的按钮,当我使用self设置它时,它运行正常:

#import <Foundation/Foundation.h>


@interface TestMessage : NSObject {
     IBOutlet NSTextField *text;
}

- (IBAction) setMessage: (id) controller;
- (void) Message:(NSString *) myMessage;    
@end

#import "TestMessage.h"

@implementation TestMessage

- (IBAction) setMessage: (id) controller {
    // This works
    [self Message:@"Hello"];

    // but this doesn't
    TestMessage * messageTest= [TestMessage new];
    [messageTest Message:@"Hi"];

}
- (void) Message: (NSString *) myMessage {
    [text setStringValue: myMessage]; 
    NSLog(@"Message Was Called");
    // This returns <NSTextField: 0x1001355b0> when called 
    // using self, but null when called the other way.
    NSLog(@"%@", text);
}

@end

我已经搜索了一段时间,但仍然找不到答案。

我想这与委托有关,但我不确定。

提前致谢。

3 个答案:

答案 0 :(得分:1)

anotherFuntion调用消息时,您确定要调用消息吗?如果anotherFuntion是另一个类的方法,则调用[self message:]将无法正常工作...

答案 1 :(得分:0)

我知道这是一个老帖子,但今天我一直在摆弄同样的问题。 您必须在textfield中返回字符串值:

[textField stringValue];

答案 2 :(得分:0)

代码

TestMessage * messageTest = [TestMessage new];

不常见,特别是new。我将假设new只是一种类方法,而alloc / init相当于

 TestMessage * messageTest = [[TestMessage alloc] init];

主要问题是只有在类IBOutlet NSTextField *text加载了Nib文件时才会初始化TestMessage。它必须在Interface Builder中被命名为对象的类,如此

Set to load this class in IB

您必须实现initWithCoderencodeWithCoder这样的内容才能从IB编码中提取字段值:

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        self.text = [coder decodeObjectForKey:@"text"];
    }
    return self;
}


-(void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:self.text forKey:@"text"];
}

从根本上说,IBOutlet字段在您创建该类实例的任何地方都不会被连接起来。如果他们这样做了,您如何表示该字段A应该连接到UI对象A而字段B应该连接到UI对象B?仅在从Nib文件加载类的上下文中建立连接。