【问题标题】:passing values between methods in objective c [closed]在目标c中的方法之间传递值[关闭]
【发布时间】:2013-01-05 18:57:49
【问题描述】:

我很困惑。阅读大量资源,但没有帮助。 如何将方法(变量)中生成的值传递给另一种方法,以便将其用于计算。我发现了一篇关于将属性放入 .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;

拜托,你能帮帮我吗?现在我觉得很愚蠢,因为它必须是一件简单的事情。

问候,

阿德里

【问题讨论】:

    标签: ios objective-c cocoa-touch cllocation


    【解决方案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];
    

    【讨论】:

    • 谢谢!我试过你的回复,效果很好。必须说:我以为它会很简单……但是这么简单?我有点羞愧;)。现在我要处理有条件的 AlertView。祝我好运。再次感谢!
    【解决方案2】:

    首先,关于您的标头,您确实不需要需要将 iVar 与 @property 声明分开声明。其实最好不要。 @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;

    这应该是strong,而不是像您使用 ARC 一样保留。

    【讨论】:

      【解决方案3】:

      如果您的第一个函数返回一个值,您可以简单地将该函数用作需要使用该值的函数的参数。

      例子:

      [aFunction:[otherFunction]];
      

      专门针对您的示例,将函数更改为返回(void)recordLocation(CLLocation)recordLocation

      【讨论】:

        【解决方案4】:

        使用属性是完全正确的。不过,它可能是当地的财产。但是,它应该可以工作。

        你的错误在这里:

        CLLocation *tempPos = ... 
        

        虽然定义了相同类型和名称的属性,但您正在定义相同类型和名称的本地(在方法内)对象。这隐藏了财产。

        原则上这很好 - 如果您需要这样做。在这种情况下

        tempPos = ... 
        

        将访问局部变量而

        self.tempPos = ...

        将访问该属性(通过设置器)。

        但是,这里不需要局部变量。换个方式

        CLLocation *tempPos = ...
        

        self.tempPos = ...
        

        你应该没事。

        【讨论】:

          【解决方案5】:

          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;
          
          }
          

          我看到你下面的代码,return 不见了。

          - (CLLocationDistance)distanceFromLocation{
          
               ...
          
               [lonDistance setText:distText];
          }
          

          【讨论】:

          • 你是对的。但这将如何解决他的 tempPos 变量问题?但是,我不认为他是在要求传递参数。这需要一种方法调用另一种方法。
          • @HermannKlecker:检查我的编辑。
          • 仍然有一个类属性 tempPos 和一个局部变量 tempPos。存储在 recordLocation 内 tempPos 中的值永远不会在他的 distanceFromLocation 中的 tempPos 中,他实际上 NSLogs 类属性。
          • 如果是这种情况,那么编译器将显示警告.. 本地实例隐藏属性... 然后他可以更改局部变量..
          猜你喜欢
          • 1970-01-01
          • 2013-12-02
          • 1970-01-01
          • 2020-04-28
          • 2013-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多