2011-08-08 32 views
2

我知道这很简单,这就是为什么我一直在试图自己想出来,但我在我的绳索结束。可可:从一个单独的类获取方法的返回值

当用户点击一个按钮的操作是应该做到这一点:

- (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”,该类应从文本字段返回字符串值并创建日志。

实际发生的事情是,当按下开始时,日志会显示“名称是:(空)”。而第二个日志甚至没有出现。我认为这是因为“名称”方法没有被调用。但我不知道为什么。我应该指定,他们是在不同的班级,我宣布这样的“名”的方法:

- (NSString*)name; 

编辑:经过我身边多一点嘴硬发现,当“名”的方法会从它自己的类中调用,日志正确显示了文本字段中的内容。我在“name”方法中加入了一个额外的日志,并且我可以看到它从另一个类中调用,但是它返回的值仍然为(null),这意味着在调用之后发生了阻止从获取文本字段字符串的类。

编辑:我不知道这是否重要,但其中一个类是NSObject的子类,另一个是NSViewController的子类。

如果您需要更多信息,请告知我。 感谢您的帮助。

回答

3

name方法中,您不能在NSLog()命令之前返回值 - 从方法返回是方法中发生的最后一件事(我很惊讶您没有收到有关NSLog()的警告函数没有被调用)。试试这个:

- (NSString *)name { 
    NSLog(@"stringValue = %@", [nameInput stringValue]); 
    return [nameInput stringValue]; 
} 

至于为什么nameInput没有价值,我猜你没有正确正确地在Interface Builder连接文本字段。

+0

修复顺序现在使它们都出现,但它们仍然只显示(空),即使再次链接它之后 – Elbimio

2

我不确定这是否是正确答案,因为您尚未完全说明nameInput的来源以及它的价值。但我猜这是一个MyClass的实例变量。在startAction:中,您将创建MyClass的新实例。 MyClassinit方法是否也初始化nameInput?由于alloc initializes the instance variables to nil(或00.0,...取决于类型),如果你的init方法没有任何其他的值赋给nameInput,它仍然是nil在点时startAction:发送nameMyClass实例。在大多数情况下,在Objective-C中向nil发送消息返回nil(*),因此在此情况下,发送stringValuenameInput将返回nil,因此您会在日志中获得(null)输出。

(*)欲了解更多信息,请参阅my answer to the question "Sending a message to nil?"

+0

这是有道理的。 nameInput是一个文本字段,值来自用户输入。我在init方法中添加了[nameInput init],但它仍然不起作用。 – Elbimio

+1

如果这一行是你添加的,它只是将'init'发送给'nil'。您可能希望(重新)阅读Xcode关于“分配和初始化对象”的文档。如果您不是,那么我并不意味着冒犯,但它看起来像是一个开始(Objective-C)程序员。我强烈建议你先学习Smalltalk。学习起来更容易,而且Objective-C很大程度上依赖于它,所以稍后可以轻松应对Objective-C的额外复杂性。一个好的起点是Pharo的“立即开始”下载:http://www.pharo-project.org/ – Rinzwind

0

- (NSString *)name { 
return [nameInput stringValue]; 
NSLog(@"stringValue = %@", [nameInput stringValue]); 

属于

MyClass *anInstance = [[MyClass alloc] init]; 

为了这,我相信,nameInput是不是它的一部分。

可能尝试添加一个文本框参数名称方法和你nameInput传递给MyClass的像

- (IBAction)startAction:(id)sender { 
MyClass *anInstance = [[MyClass alloc] init]; 
NSLog(@"the name is:%@", [anInstance name:nameInput]); 

希望这有助于。

相关问题