Cocoa:从单独的类中获取方法的返回值

时间:2011-08-08 01:34:42

标签: objective-c cocoa class methods nsstring

我知道这很简单,这就是为什么我一直在试图像疯了一样弄明白自己,但我在我的穷途末路。

当用户点击按钮时,假设的操作是

- (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的子类。

如果您需要更多信息,请与我们联系。 谢谢你的帮助。

3 个答案:

答案 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(或00.0,......,具体取决于类型)以及init方法未将任何其他值分配给nameInput ,当nilstartAction:发送到新的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]);

希望这有帮助。