Передача значений между методами в цели 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 = ...

и ты должен быть в порядке.

Другие вопросы по тегам