1

よくわかりません。多くのリソースを読み上げましたが、役に立ちませんでした。メソッド (変数) で生成された値を別のメソッドに渡して、計算に使用できるようにするにはどうすればよいですか。プロパティを .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;

助けてくれますか?今は単純なことでなければならないので、とてもばかげていると感じています。

よろしく、

アドリ

4

5 に答える 5

1

まず、ヘッダーに関しては、宣言とは別に iVar を宣言する必要はありませ@property。実際、しないのが一番です。宣言は@property、iVar を自動合成し、前に _underscore を付けて名前を付けます。

次に、iVar を直接_tempPosまたはプロパティを介して参照できますself.tempPos。ほとんどの場合、プロパティ構文を使用する必要があります。これにより、ローカル変数ではなく iVar にアクセスしていることを確認できます (ここでの混乱の原因)。

(この点を明確にするために、この質問に対する私の回答を参照してください:
インターフェースで変数を宣言するか、objective-c arc でプロパティを使用する必要がありますか? )

ここ:

CLLocation *tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon]; 

という新しいローカル変数を作成していますtempPos

あなたが意図したことは、新しい CLLocation をtempposiVar に割り当てることでした:

self.tempPos = [[CLLocation alloc] initWithLatitude:valueLat longitude:valueLon]; 

ここのエラーにも注意してください:
@property (retain) CLLocation *tempPos;

ARC を使用しているため、保持ではなく、これは強力である必要があります。

于 2013-01-22T14:20:33.173 に答える
1

問題の理由は、メソッドでローカル変数を宣言しているため、インスタンス プロパティを操作していないことです。

CLLocation *tempPos = ...

その行を次のように変更します。

tempPos = ...

編集: メソッドの外部から結果を取得する場合のヒントとして、2 つの簡単な方法があります。

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];
于 2013-01-22T14:06:53.563 に答える
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];
}
于 2013-01-22T14:07:50.813 に答える
0

最初の関数が値を返す場合、値を使用する必要がある関数の引数としてその関数を使用できます。

例:

[aFunction:[otherFunction]];

具体的には、関数を変更して、代わりに返すように(void)recordLocation します(CLLocation)recordLocation

于 2013-01-22T14:05:29.897 に答える
0

プロパティを使用することは非常に正しいです。ただし、それはローカルプロパティである可能性があります。ただし、動作するはずです。

あなたの間違いはここにあります:

CLLocation *tempPos = ... 

同じ型と名前のプロパティが定義されていますが、同じ型と名前のローカル (メソッド内) オブジェクトを定義しています。それはプロパティを非表示にします。

原則として、これは問題ありません-それを行う必要がある場合。このような場合には

tempPos = ... 

ローカル変数にアクセスします

self.tempPos = ...

(setter を介して) プロパティにアクセスします。

ただし、ここではローカル変数は必要ありません。変えるだけ

CLLocation *tempPos = ...

self.tempPos = ...

そしてあなたは大丈夫なはずです。

于 2013-01-22T14:08:58.793 に答える