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