Передача значений между методами в цели c
Я не совсем понимаю. Читайте о многих ресурсах, но это не помогло. Как передать значение, сгенерированное в методе (переменной), другому методу, чтобы его можно было использовать для расчетов. Я нашел сообщение о размещении свойства в файле.h. Сделал это. В моем методе я сначала вызвал имя метода, а затем переменную, но она не будет работать. Это код:
-(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;
Не могли бы вы мне помочь пожалуйста? Сейчас я чувствую себя очень глупо, потому что это должно быть просто.
С Уважением,
Адри
5 ответов
Причина вашей проблемы в том, что в вашем методе вы объявляете локальную переменную, поэтому вы не работаете со свойством экземпляра.
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];
Во-первых, что касается ваших заголовков, вам не нужно объявлять iVar отдельно от вашего @property
декларация. На самом деле это лучше не делать. @property
Объявление автоматически синтезирует iVar и назовет его с предшествующим _underscore.
Затем вы можете обратиться к iVar либо непосредственно как _tempPos
или через его собственность self.tempPos
, Вы должны почти всегда использовать синтаксис свойства. Это обеспечит вашу уверенность при доступе к iVar, а не к локальной переменной (источник вашей путаницы здесь).
(Смотрите мой ответ на этот вопрос, чтобы уточнить этот момент:
Должен ли я объявить переменные в интерфейсе или использовать свойство в arc-target?)
Вот:
CLLocation *tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon];
вы создаете новую локальную переменную под названием tempPos
То, что вы намеревались сделать, это назначить ваш новый CLLocation на ваш temppos
Ивар:
self.tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon];
Также обратите внимание на ошибку здесь:
@property (сохранить) CLLocation *tempPos;
Это должно быть сильным, а не сохранять, как вы используете ARC.
Если ваша первая функция возвращает значение, вы можете просто использовать эту функцию в качестве аргумента для функции, которая должна использовать это значение.
Пример:
[aFunction:[otherFunction]];
Специально для вашего примера измените функцию, чтобы она возвращалась вместо (void)recordLocation
в (CLLocation)recordLocation
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];
}
Использование свойства совершенно правильно. Это может быть местная собственность, хотя. Тем не менее, это должно работать.
Ваша ошибка здесь:
CLLocation *tempPos = ...
Хотя определено свойство того же типа и имени, вы определяете локальный (внутри метода) объект того же типа и имени. Это скрывает собственность.
В принципе это нормально - если вам когда-нибудь понадобится это сделать. В таком случае
tempPos = ...
будет обращаться к локальной переменной в то время как
self.tempPos = ...
будет иметь доступ к свойству (через установщик).
Однако здесь вам не нужна локальная переменная. Просто поменяй
CLLocation *tempPos = ...
в
self.tempPos = ...
и ты должен быть в порядке.