Ios 在目标c中的方法之间传递值

Ios 在目标c中的方法之间传递值,ios,objective-c,cocoa-touch,cllocation,Ios,Objective C,Cocoa Touch,Cllocation,我很困惑。阅读了大量的资源,但没有帮助。 如何将方法(变量)中生成的值传递给另一个方法,以便用于计算。我发现了一篇关于将属性放入.h文件的帖子。是我干的。 在我的方法中,我先调用methodname,然后调用变量,但它不起作用。 代码如下: -(void)recordLocation{ double valueLat = [[latitude text]doubleValue]; int latSeconds = valueLat * 3600; int latDegrees = latSec

我很困惑。阅读了大量的资源,但没有帮助。 如何将方法(变量)中生成的值传递给另一个方法,以便用于计算。我发现了一篇关于将属性放入.h文件的帖子。是我干的。 在我的方法中,我先调用methodname,然后调用变量,但它不起作用。 代码如下:

-(void)recordLocation{

double valueLat = [[latitude text]doubleValue];
int latSeconds = valueLat * 3600;
int latDegrees = latSeconds / 3600;
latSeconds = abs(latSeconds % 3600);
int latMinutes = latSeconds / 60;
latSeconds %= 60;

char latChar = (latitude > 0) ? 'N' : 'S';

double valueLon = [[longitude text]doubleValue];
int lonSeconds = valueLon * 3600;
int lonDegrees = lonSeconds / 3600;
lonSeconds = abs(lonSeconds % 3600);
int lonMinutes = lonSeconds / 60;
lonSeconds %= 60;

char lonChar = (longitude > 0) ? 'E' : 'W';

CLLocation *tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon]; //tempPos is what I want to pass

NSString *recPosition = [[NSString alloc]initWithFormat:@"%i° %i' %i\" %c" "   " @"%i° %i' %i\" %c \n", latDegrees, latMinutes, latSeconds, latChar,lonDegrees, lonMinutes, lonSeconds, lonChar];

_labelDegrees.text = recPosition;

//NSLog(@"%f" , valueLat);
//NSLog(@"%f" , valueLon);
//NSLog (@"%@", tempPos);



}

- (CLLocationDistance)distanceFromLocation{

double lat1 = [[latitude text] doubleValue];
double lon1 = [[longitude text] doubleValue];


CLLocation *currentLocation = [[CLLocation alloc] initWithLatitude:lat1 longitude:lon1];

CLLocationDistance locDistance = [currentLocation distanceFromLocation:recordLocation.tempPos];//tempPos is what I want to use from recordLocation

NSString *distText = [[NSString alloc]initWithFormat:@"%f", locDistance];

//NSLog(@"%f", lat1);
//NSLog(@"%f", lon1);
NSLog(@"%@", currentLocation);
NSLog(@"%@", tempPos);


[lonDistance setText:distText];
}
让我痛苦的是变化无常的温度。 为了尽可能完整,这里是我的.h文件

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#import "Corelocation/Corelocation.h"


NSString *latr;
NSString *longr;
NSString *latLabDeg;
NSString *lat;
NSString *lon;
NSString *acc;
double valueLon;
double valueLat;
double latvalue;
double lonvalue;
CLLocation *tempPos;

@interface ViewController : UIViewController <CLLocationManagerDelegate>
@property (strong, nonatomic) IBOutlet UITextField *accuracy;
@property (strong, nonatomic) IBOutlet UITextField *latitude;
@property (strong, nonatomic) IBOutlet UITextField *longitude;
@property (strong, nonatomic) CLLocationManager *location;
@property (strong, nonatomic) IBOutlet UITextField *latrec;
@property (strong, nonatomic) IBOutlet UITextField *longrec;
@property (strong, nonatomic) IBOutlet UILabel *labelDegrees;
@property (strong, nonatomic) IBOutlet UITextField *lonDistance;
@property (nonatomic) CLLocationDistance *locDistance;
@property (retain) CLLocation *tempPos;

//- (CLLocationDistance)distanceFromLocation;
#导入
#进口
#导入“Corelocation/Corelocation.h”
NSString*latr;
NSString*longr;
NSString*latLabDeg;
NSString*lat;
NSString*lon;
NSString*acc;
双值;
双参数;
双值;
双重价值;
CLLocation*tempPos;
@界面ViewController:UIViewController
@属性(强、非原子)IBUITEXTFIELD*精度;
@属性(强,非原子)IbUitextField*纬度;
@属性(强,非原子)IBUTextField*经度;
@属性(强,非原子)CLLocationManager*位置;
@属性(强,非原子)IBUitextField*latrec;
@属性(强,非原子)ibuitextfield*longrec;
@属性(强,非原子)IBUILabel*labelDegrees;
@属性(强,非原子)IBUITextField*lonDistance;
@属性(非原子)CLLocationDistance*LocationDistance;
@财产(保留)CLLocation*tempPos;
//-(CLLocationDistance)距离位置的距离;
拜托,你能帮我吗?现在我觉得自己很愚蠢,因为这必须是一件简单的事情

问候,


Adri

如果第一个函数返回一个值,则只需将该函数用作需要使用该值的函数的参数即可

例如:

[aFunction:[otherFunction]];
特别针对您的示例,将函数更改为返回isntead of
(void)recordLocation

(CLLocation)recordLocation

问题的原因是,在方法中,您正在声明一个局部变量,因此无法使用实例属性

CLLocation *tempPos = ...
将该行更改为:

tempPos = ...
编辑: 一些提示如果您想从方法外部获得该结果,有两种简单的方法:

1) 返回该变量。由于您的方法是一个
-(void).
(不返回任何内容),因此可以轻松添加一个返回变量并
返回tempPos在末尾

2) 如果在将来您已经有了一个返回值,但仍然希望外部方法能够访问您在那里生成的内容,则可以执行以下操作:

- (NSInteger)someMethod:(ObjectClassName **)object { // Yes, there are TWO of these > *
    .. work some magic
    ObjectClassName *theObject = ...

    *object = theObject;
    return whatever;
}
你这样称呼它:

ObjectClassName *object = nil;
NSInteger whatever = [self someMethod:&object]; // < this behavior comes from c++
NSInteger whatever = [self someMethod:nil];

如何将方法(变量)中生成的值传递给另一个方法,以便用于计算。

resultValue=[self secondMethodParameter:[self firstMethodParameter:parameter]];

您正在调用此方法:

CLLocationDistance locDistance=[currentLocation distanceFromLocation:recordLocation.tempPos]//tempPos是我想在recordLocation中使用的

将其更改为:

CLLocationDistance locDistance=[currentLocation distanceFromLocation:[self-recordLocation]]//tempPos是我想在recordLocation中使用的

方法如下:

-(CLLocation *)recordLocation{

   ...

    CLLocation *tempPosLocal = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon]; //tempPos is what I want to pass

    ...

    return tempPosLocal;

}

我看到你的以下代码,返回丢失

- (CLLocationDistance)distanceFromLocation{

     ...

     [lonDistance setText:distText];
}

使用属性是非常正确的。不过,它可能是当地的财产。然而,它应该起作用

你的错误在这里:

CLLocation *tempPos = ... 
尽管定义了相同类型和名称的属性,但您正在定义相同类型和名称的本地(在方法中)对象。这隐藏了财产

原则上这很好——如果你需要的话。在这种情况下

tempPos = ... 
将在

self.tempPos=…

将访问该属性(通过setter)

但是,这里不需要局部变量。换衣服

CLLocation *tempPos = ...


你应该没事的

首先,关于标题,不需要将iVar与
@属性
声明分开声明。事实上,最好不要这样做。
@property
声明将自动合成一个iVar,并用前面的下划线将其命名

然后,您可以直接将iVar引用为
\u tempPos
,或者通过其属性
self.tempPos
。您几乎应该始终使用属性语法。这将确保您在访问iVar而不是局部变量(这里是您混淆的根源)时是确定的

(见我对这个问题的回答,以澄清这一点:
)

在这里:

您正在创建一个名为
tempPos

您打算将新的CLLocation分配给您的
temppos
iVar:

self.tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon]; 
请注意此处的错误:
@财产(保留)CLLocation*tempPos


这应该是强大的,而不是保留,因为您正在使用ARC。

您是对的。但这将如何解决他的tempPos变量的问题呢?然而,我不认为他要求通过参数。这需要一个方法调用另一个。@HermannKlecker:检查我的编辑。仍然有一个类属性tempPos和一个局部变量tempPos。recordLocation中存储在tempPos中的值将永远不会出现在tempPos的distanceFromLocation中,他实际记录类属性的位置。如果是这种情况,编译器将显示警告。。本地实例隐藏属性。。。然后他可以更改局部变量..谢谢!我试过你的回答,效果很好。必须说:我以为这会很简单。。。但这么简单?我有点羞愧;)。现在我要处理一个条件AlertView。祝我好运。再次感谢!
CLLocation *tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon]; 
self.tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon];