【问题标题】:Cocoa: Getting the return value of a method from a separate classCocoa:从单独的类中获取方法的返回值
【发布时间】:2011-10-22 01:34:41
【问题描述】:

我知道这很简单,这就是为什么我一直在疯狂地尝试自己弄清楚但我已经走到了尽头。

当用户单击按钮时,应该执行此操作:

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

如你所见,MyClass 有“name”方法,就是这样:

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

nameInput 是一个文本字段,用户填写一个名称,按下按钮调用“startAction”,该方法应该在另一个类中调用“name”,它应该从文本字段返回字符串值并制作日志.

实际发生的是,当按下开始时,日志显示“名称为:(null)”。第二个日志甚至没有出现。我认为这是因为“名称”方法没有被调用。但我不知道为什么。我应该指定它们在不同的类中,并且我声明了这样的“名称”方法:

- (NSString*)name;

编辑:经过一番胡闹后,我发现当“name”方法从它自己的类中调用时,日志会正确显示文本字段中的任何内容。我在“name”方法中放了一个额外的日志,我可以看到它 is 从另一个类中被调用,但它返回的值仍然是(null),这意味着在阻止类获取文本字段字符串的调用。

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

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

【问题讨论】:

    标签: objective-c cocoa class methods nsstring


    【解决方案1】:

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

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

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

    【讨论】:

    • 现在修复顺序会使它们都出现,但它们仍然只显示 (null),即使在再次链接后也是如此
    【解决方案2】:

    我不确定这是不是正确答案,因为您还没有完全解释 nameInput 的来源以及它如何获得价值。但我猜它是MyClass 的实例变量。在startAction: 中创建MyClass 的新实例。 MyClassinit方法是否也初始化nameInput?由于alloc initializes the instance variables to nil(或00.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?"

    【讨论】:

    • 这是有道理的。 nameInput 是一个文本字段,值来自用户输入。我将 [nameInput init] 添加到 init 方法中,但仍然无法正常工作。
    • 如果该行是您添加的全部内容,它只会将init 发送到nil。你可能想(重新)阅读 Xcode 关于“分配和初始化对象”的文档。如果你不是,我并不是要冒犯,但看起来你确实是一个初级(Objective-C)程序员。我强烈建议你先学习 Smalltalk。它更容易学习,而且由于 Objective-C 大量基于它,您可以稍后轻松地承担 Objective-C 的额外复杂性。一个很好的起点是 Pharo 的“立即开始”下载:pharo-project.org
    【解决方案3】:

    你的

    - (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]);
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多