Ios 将UITextField值传递给视图中的函数

Ios 将UITextField值传递给视图中的函数,ios,function,uitextfield,scope,Ios,Function,Uitextfield,Scope,我刚刚开始使用XCode和iOS编码,有以下问题。我想添加一个函数,根据UIStepper中的值,在ViewController中设置UITextField值。该代码实际上处理三个UITextFields的格式设置,将其剪切为一以缩短示例。此代码工作正常: - (IBAction)Temp_Stepper_Changed:(UIStepper *)sender { integer_t stepperValue = (integer_t) sender.value; NSStrin

我刚刚开始使用XCode和iOS编码,有以下问题。我想添加一个函数,根据
UIStepper
中的值,在
ViewController
中设置
UITextField
值。该代码实际上处理三个
UITextField
s的格式设置,将其剪切为一以缩短示例。此代码工作正常:

- (IBAction)Temp_Stepper_Changed:(UIStepper *)sender {
    integer_t stepperValue = (integer_t) sender.value;
    NSString *temp_format = [[NSString alloc]
                             initWithFormat: @"%%.%df",stepperValue];
    double fahrenheit = [_TempF_Text.text doubleValue];
    NSString *FresultString = [[NSString alloc]
                               initWithFormat: temp_format,fahrenheit];
    _TempF_Text.text = FresultString;
}
我有几个地方想这样做,所以我想创建一个要调用的函数,所以我把这个函数放到视图控制器的.m文件中:

void Temp_Text_Update (double F_Temp){
    NSString *FresultString = [[NSString alloc]
                               initWithFormat: @"%.2f",F_Temp];
    _TempF_Text.text = FresultString;
}
函数无法编译,导致错误:

use of undeclared identifier '_TempF_Text'
如果没有行,它编译得很好,可以调用函数,传递值,等等。我假设(记住,从这里开始)作为
UIStepper
在它的范围内有
\u TempF\u Text
,函数也在同一个.m文件中。在幕后是否发生了一些神奇的事情,允许
iAction
类型调用从
ViewController
项访问任何值,但我的函数缺少上述神奇功能?我还需要
UIStepper
值来完成函数。这是使用故事板构建的,控制出口和动作的拖动,头文件是:

@interface TemperatureViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *TempF_Text;
@property (weak, nonatomic) IBOutlet UIStepper *Temp_Stepper;

- (IBAction)TempF_CnvButton:(id)sender;
- (IBAction)Temp_Stepper_Changed:(UIStepper *)sender;

我花了几个小时搜索,包括这个网站,找到了从一个
ViewController
到另一个的引用,等等,但并不匹配;尽管尝试了一些方法,但没有任何效果(尽管有些方法产生了额外的错误)。我怀疑这是如此明显和简单,以至于没有人问我,但我已经没有想法了,任何帮助都将不胜感激。

要回答具体问题,您尝试编写的签名的正确语法如下所示:

- (void)Temp_Text_Update:(double)F_Temp {
// get a double from a string
- (double)doubleFromString:(NSString *)string {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber *number = [formatter numberFromString:string];
    return [number doubleValue];
}

// get a string from a double: 
- (NSString *)stringFromDouble:(double)aDouble {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    return [formatter stringFromNumber:[NSNumber numberWithDouble:aDouble]];
}
NSString *text = self.someControlView.text;
double aDouble = [self doubleFromString:text];

// do computation on aDouble, resulting in
double result = // whatever
[self setOutputTextWithResult:result];
这说明我们有一个名为Temp_Text_Update的方法:它接受一个名为F_Temp的双参数,并且不返回任何内容

一个更通用的解决方案是使用NSNumberFormatter以对区域设置敏感的方式在字符串和双精度之间切换,如下所示:

- (void)Temp_Text_Update:(double)F_Temp {
// get a double from a string
- (double)doubleFromString:(NSString *)string {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber *number = [formatter numberFromString:string];
    return [number doubleValue];
}

// get a string from a double: 
- (NSString *)stringFromDouble:(double)aDouble {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    return [formatter stringFromNumber:[NSNumber numberWithDouble:aDouble]];
}
NSString *text = self.someControlView.text;
double aDouble = [self doubleFromString:text];

// do computation on aDouble, resulting in
double result = // whatever
[self setOutputTextWithResult:result];
那么您的计算功能将如下所示:

- (void)Temp_Text_Update:(double)F_Temp {
// get a double from a string
- (double)doubleFromString:(NSString *)string {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber *number = [formatter numberFromString:string];
    return [number doubleValue];
}

// get a string from a double: 
- (NSString *)stringFromDouble:(double)aDouble {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    return [formatter stringFromNumber:[NSNumber numberWithDouble:aDouble]];
}
NSString *text = self.someControlView.text;
double aDouble = [self doubleFromString:text];

// do computation on aDouble, resulting in
double result = // whatever
[self setOutputTextWithResult:result];
最后,您的方法(更好地命名):


它现在很短,几乎不需要自己的方法。

与您的问题无关,但方法和属性的objective-c名称的约定是使用驼峰大小写,第一个字母是小写(类为大写)。因此,Temp_Stepper_Changed应为tempStepperChanged:。如果你遵循惯例,你的代码将更容易让其他人阅读。错误是你在问题中遇到的未声明标识符“_Temp_Text”,还是未声明标识符“_Temp_Text”?谢谢你的提醒,rdelmar;将查找并遵循约定。将方法格式更改为“-(void)setTemperatureFields:(double)fahrenheitemp{”基于上述内容,将方法格式更改为-(void)setTemperatureFields:(double)fahrenheitemp{并将_TempF_Text.Text=FresultString;更改为self.TempF_Text.Text=FresultString;。添加self.不会像在我的方法上编写的那样工作,尽管该方法在调用它和执行其他代码方面工作正常-只是不允许引用UITextField或UIStepper。将使用NSNumberFormatter;目的是方法是将文本字段的格式设置为步进值提供的小数。有很多要学习的,谢谢帮助!