我知道这很简单,这就是为什么我一直在试图像疯了一样弄明白自己,但我在我的穷途末路。
当用户点击按钮时,假设的操作是
。- (IBAction)startAction:(id)sender {
MyClass *anInstance = [[MyClass alloc] init];
NSLog(@"the name is:%@", [anInstance name]);
如您所见,MyClass具有“名称”方法,即:
- (NSString *)name {
return [nameInput stringValue];
NSLog(@"stringValue = %@", [nameInput stringValue]);
nameInput是用户填写名称的文本字段,按下按钮调用“startAction”,该方法应在另一个类中调用“name”,该类应从文本字段返回字符串值并生成日志
实际发生的是当按下start时,日志显示“名称为:(null)”。第二个日志甚至没有出现。我认为这是因为“名称”方法没有被调用。但我不知道为什么。我应该指定它们在不同的类中,并且我声明了这样的“名称”方法:
- (NSString*)name;
编辑:经过一番愚弄后,我发现当“name”方法从它自己的类调用时,日志会正确显示文本字段中的内容。我在“name”方法中添加了一个额外的日志,我可以看到从另一个类调用 ,但是它返回的值仍然是(null),这意味着之后发生了一些事情。调用阻止类获取文本字段字符串。
编辑:我不确定这是否重要,但其中一个类是NSObject的子类,另一个是NSViewController的子类。
如果您需要更多信息,请与我们联系。 谢谢你的帮助。
答案 0 :(得分:3)
在name
方法中,你不能在NSLog()
命令之前返回一个值 - 从方法返回是方法中发生的最后一件事(我很惊讶你不要t得到关于NSLog()
函数未被调用的警告。试试这个:
- (NSString *)name {
NSLog(@"stringValue = %@", [nameInput stringValue]);
return [nameInput stringValue];
}
至于为什么nameInput
没有值,我猜你没有在Interface Builder中正确连接文本字段。
答案 1 :(得分:2)
我不确定这是否是正确的答案,因为你还没有完全解释nameInput
来自哪里以及它是如何获得它的价值的。但我猜它是MyClass
的实例变量。在startAction:
中,您可以创建MyClass
的新实例。 init
MyClass
方法是否也初始化nameInput
?自alloc
initializes the instance variables to nil
(或0
,0.0
,......,具体取决于类型)以及init
方法未将任何其他值分配给nameInput
,当nil
将startAction:
发送到新的name
实例时,它仍然是MyClass
。在大多数情况下,在Objective-C中向nil
发送消息会返回nil
(*),因此在这种情况下将stringValue
发送到nameInput
会返回nil
,因此您在日志中获得(null)
输出。
(*)有关详细信息,请参阅my answer to the question "Sending a message to nil?"
答案 2 :(得分:0)
您
- (NSString *)name {
return [nameInput stringValue];
NSLog(@"stringValue = %@", [nameInput stringValue]);
属于
MyClass *anInstance = [[MyClass alloc] init];
我相信,其中nameInput不属于它。
可以尝试在name方法中添加textField参数,并将nameInput传递给MyClass,如
- (IBAction)startAction:(id)sender {
MyClass *anInstance = [[MyClass alloc] init];
NSLog(@"the name is:%@", [anInstance name:nameInput]);
希望这有帮助。