我正在尝试设置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
我已经搜索了一段时间,但仍然找不到答案。
我想这与委托有关,但我不确定。
提前致谢。
答案 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中被命名为对象的类,如此
您必须实现initWithCoder
和encodeWithCoder
这样的内容才能从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文件加载类的上下文中建立连接。