我刚刚开始使用XCode和iOS编码,有以下问题。我想添加一个函数,该函数根据UITextField
中的值设置ViewController
中的UIStepper
值。代码实际上处理格式化三个UITextField
,将其剪切为一个以缩短示例。这段代码工作正常:
- (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
在其范围内有_TempF_Text
,函数在同一个.m文件中也是如此。幕后是否有一些神奇的事情允许IBAction
类型调用访问ViewController
项中的任何值,但我的功能是否缺少魔法?我还需要UIStepper
值才能完成该功能。这是使用Storyboard构建的,对出口和操作进行控制拖动,头文件为:
@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
到另一个{{1}}的引用,等等,但是并不匹配;无论如何都尝试了一些东西,但没有任何效果(虽然有些产生了额外的错误)。我怀疑它是如此明显和简单,以至于没有被问到,但我已经没有想法了,任何帮助都会受到赞赏。
答案 0 :(得分:0)
要回答具体问题,您尝试编写的签名的正确语法如下所示:
- (void)Temp_Text_Update:(double)F_Temp {
这说明我们有一个名为Temp_Text_Update的方法:它接受一个名为F_Temp的双参数,并且不会返回任何内容。
更通用的解决方案是使用NSNumberFormatter以区域设置敏感的方式在字符串和双精度之间进行处理,如下所示:
// 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) setOutputTextWithResult:(double)result {
self.someControlView.text = [self stringFromDouble:result];
}
现在它太短了,它几乎不需要它自己的方法。