Objective c 如何正确地从方法返回值,并在应用程序加载后立即使其可用?

Objective c 如何正确地从方法返回值,并在应用程序加载后立即使其可用?,objective-c,cocoa,Objective C,Cocoa,第一个帖子在这里,所以很抱歉它的长度。到目前为止,我一直在潜行,学到了很多东西,但现在我必须介入并提出一个问题。我已经阅读了很多常见问题解答中建议的帖子,但我找不到确切的答案 在此之前,我要说的是,我是编程的初学者(更不用说Objective-C了),所以请原谅我对术语的误用。任何有趣的英语都是一样的,因为英语不是我的母语 我正在构建一个单位转换应用程序,其中的主窗口包含两个popubButtons。我从两个popupubuttons中使用indexOfSelectedItem来计算float值

第一个帖子在这里,所以很抱歉它的长度。到目前为止,我一直在潜行,学到了很多东西,但现在我必须介入并提出一个问题。我已经阅读了很多常见问题解答中建议的帖子,但我找不到确切的答案

在此之前,我要说的是,我是编程的初学者(更不用说Objective-C了),所以请原谅我对术语的误用。任何有趣的英语都是一样的,因为英语不是我的母语

我正在构建一个单位转换应用程序,其中的主窗口包含两个
popubButton
s。我从两个
popupubutton
s中使用
indexOfSelectedItem
来计算
float
值(我最初在
AwakeFromNib
中获取索引,后来在用户更改选择时在弹出按钮控制器方法中获取索引)

我的问题由两部分组成:首先,当我比较所选项目的两个索引的每个组合时,计算该
浮点值的代码非常庞大。其次,我需要在启动后立即获得计算出的浮点值,因为用户可能希望在使用任何窗口弹出按钮之前执行转换(否则,我会将计算代码放在-
(iAction)
方法中)

因此,我尝试使用以下代码来计算浮点值:

@interface MyClass: NSObject

float calculatedFloat;

-(void)setCalculatedFloat:(float)calcFl;
-(float)calculatedFloat;

@implementation MyClass

-(void)setCalculatedFloat:(float)calcFl {
  calcFl = 1.0; // I'm simplifying, this is where I'd like to perform calculation
}

-(float)calculatedFloat {
  return calculatedFloat;
}
现在,对于问题的第一部分,当我在另一种方法中使用calculatedFloat时,说:

-(void)printIt {
  NSLog(@"Calculated float equals: %.2f", calulatedFloat); 
}
我在调试器中收到的全部是0.00

第一个问题是:如果这不起作用,如何从另一个方法中正确访问该值

对于问题的第二部分,我使用了
-(void)AwakeFromNib
在启动后立即设置
弹出按钮
s等,但我真的不想把所有的浮点计算代码都放进去,只是以后在其他地方重复

因此,第二个问题是:这可能是我想要实现的吗?此外,是否需要将此计算代码移动到另一个类?如果是这样,我如何使另一个类从popUpButton中知道indexOfSelectedItem

很抱歉,这篇文章很长,可能还有一些令人困惑和愚蠢的问题。我希望你在阅读的时候不必太咬牙切齿!:)

谢谢

这在以后打印时不会显示,因为您指定给了保存新值的变量,而不是属性值的变量。您需要为
calulatedFloat
实例变量赋值。 (顺便说一句,你输入了那个变量名。)

您应该将计算转移到另一种方法中,并从
awakeFromNib
和需要重新计算的任何地方向自己发送该消息。该方法应该使用计算值调用
setCalculatedFloat:
,即
setCalculatedFloat:
应该只是一个简单的setter。一旦进行了更改,就可以用
@synthesis
语句替换自定义访问器,并让编译器为您编写访问器

我的问题由两部分组成:首先,当我比较所选项目的两个索引的每个组合时,计算该浮动的代码非常庞大

您可能会看到是否可以创建自定义对象,将其设置为菜单项“
representedObject
properties”,以便剪切出这个庞大的比较树。在不知道比较树的功能的情况下,很难更具体地说明这一点

这在以后打印时不会显示,因为您指定给了保存新值的变量,而不是属性值的变量。您需要为
calulatedFloat
实例变量赋值。 (顺便说一句,你输入了那个变量名。)

您应该将计算转移到另一种方法中,并从
awakeFromNib
和需要重新计算的任何地方向自己发送该消息。该方法应该使用计算值调用
setCalculatedFloat:
,即
setCalculatedFloat:
应该只是一个简单的setter。一旦进行了更改,就可以用
@synthesis
语句替换自定义访问器,并让编译器为您编写访问器

我的问题由两部分组成:首先,当我比较所选项目的两个索引的每个组合时,计算该浮动的代码非常庞大


您可能会看到是否可以创建自定义对象,将其设置为菜单项“
representedObject
properties”,以便剪切出这个庞大的比较树。如果不知道比较树的作用,很难对这一点进行更具体的说明。

非常感谢您的及时回复。我一直在试图找出“您应该将计算移到另一个方法(…)。该方法应该调用setCalculatedFloat:(…)”部分,但不幸的是,这正是我没有得到的部分。最终,我只能想到这些:@implementation MyClass-(void)setCalculatedFloat:(float)calcFl{calculatedFloat=calcFl;}-(float)calculatedFloat{return calculatedFloat;}-(float)calculateTheFloat{float abc=1.0;//[self-setCalculatedFloat:abc];}第三种方法的警告很明显。
calculateTheFloat
不应该返回任何内容;它应该发送
setCalculatedFloat:
消息,与您注释的内容完全相同。不幸的是,注释被乱码成一行。行
[self-setCalculatedFloat:abc];
未注释,空注释位于前一行之后。使用
[self-setCalculatedFloat:abc];
我得到
警告:控件到达非无效函数的末尾
NSLog
仍然返回
cal
-(void)setCalculatedFloat:(float)calcFl {
    calcFl = 1.0; // I'm simplifying, this is where I'd like to perform calculation
}