我很困惑。阅读大量资源,但没有帮助。 如何将方法(变量)中生成的值传递给另一个方法,以便可以将其用于计算。我发现了一篇关于在.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];
}
变量tempPos是什么给了我痛苦。 为了尽可能完整,这是我的.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;
拜托,你能帮助我吗?现在我觉得非常愚蠢,因为它必须是一件简单的事情。
此致
Adri
答案 0 :(得分:1)
您遇到问题的原因是您在方法中声明了一个局部变量,因此您没有使用您的实例属性。
CLLocation *tempPos = ...
将该行更改为:
tempPos = ...
修改强> 一些提示如果你想从方法之外得到那个结果,有两种简单的方法:
1)返回该变量。由于您的方法是- (void)...
(没有返回任何内容),您可以轻松地在末尾添加返回变量和return 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];
答案 1 :(得分:1)
首先,关于标题,不需要与@property
声明分开声明iVar。事实上最好不要。 @property
声明将自动合成iVar,并使用前面的_underscore命名。
然后,您可以直接将{iVar'引用为_tempPos
或通过其属性self.tempPos
引用。您应该几乎总是使用属性语法。这将确保您在访问iVar时确定,而不是局部变量(此处混淆的来源)。
(见我对这个问题的回答,澄清这一点:
Should I declare variables in interface or using property in objective-c arc?)
下面:
CLLocation *tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon];
您正在创建一个名为tempPos
您打算将新的CLLocation分配给temppos
iVar:
self.tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon];
另请注意这里的错误:
@property(保留)CLLocation * tempPos;
这应该强,而不是在使用ARC时保留。
答案 2 :(得分:0)
如果你的第一个函数返回一个值,你可以简单地使用该函数作为需要使用该值的函数的参数。
示例:
[aFunction:[otherFunction]];
特别针对您的示例,将函数更改为(void)recordLocation
而不是(CLLocation)recordLocation
到{{1}}
答案 3 :(得分:0)
How can I pass a value generated in a method (variable) to another method so it can be used for calculations.
resultValue=[self secondMethodParameter:[self firstMethodParameter:parameter]];
您正在调用此方法:
CLLocationDistance locDistance = [currentLocation distanceFromLocation:recordLocation.tempPos];//tempPos is what I want to use from recordLocation
将其更改为:
CLLocationDistance locDistance = [currentLocation distanceFromLocation:[self recordLocation]];//tempPos is what I want to use from 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];
}
答案 4 :(得分:0)
使用属性非常正确。它可能是一个当地的财产。但是,它应该工作。
你的错误在这里:
CLLocation *tempPos = ...
虽然定义了相同类型和名称的属性,但您定义的是同一类型和名称的本地(在方法内)对象。这隐藏了财产。
原则上这很好 - 如果你需要这样做的话。在这种情况下
tempPos = ...
将访问本地变量
self.tempPos = ...
将访问该属性(通过setter)。
但是,这里不需要局部变量。只需改变
CLLocation *tempPos = ...
到
self.tempPos = ...
你应该没事。