总的来说,我对Objective-C和iOS开发非常陌生。经过大量的努力,本周我设法使一个小型应用程序在模拟器中正确运行。
通过阅读Matt Neuburg撰写的“ iOS 7编程基础知识”,在线教程以及该网站上的建议,我掌握了编程语言的基础知识。
我编写的代码(显然)有效,但是我不完全理解为什么我需要对代码进行一些调整才能使其正常工作。
该应用程序是一个基本的应用程序,可以解决“风三角”的问题。它要做的就是将一些用户定义的变量放入正确的公式中,并显示结果。
我已经复制了.h和.m文件。简而言之:.h声明了7个变量;文本字段中有5个用户输入; 2个标签显示2个计算出的结果;一个按钮,用于启动要计算的操作。
使用以下代码,我不明白:
为什么我被迫在实现中使用下划线之前声明变量
为什么我在加载视图后被迫为变量声明.delegate为'self'
有什么建议可以使这个“应用”更加合乎逻辑并且更易于理解(我自己)?
//
// ViewController.h
// WindTriangle
//
#import <UIKit/UIKit.h>
#define M_PI 3.14159265358979323846264338327950288 /* pi */
float windDegreesFloat;
float windSpeedFloat;
float courseDesiredFloat;
float trueAirSpeedFloat;
float magneticVariationFloat;
float headingCalculatedFloat;
float groundSpeedCalculatedFloat;
@interface ViewController : UIViewController<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextView *instructionsText;
@property (weak, nonatomic) IBOutlet UITextField *windDegrees;
@property (weak, nonatomic) IBOutlet UITextField *windSpeed;
@property (weak, nonatomic) IBOutlet UITextField *courseDesired;
@property (weak, nonatomic) IBOutlet UITextField *trueAirSpeed;
@property (weak, nonatomic) IBOutlet UITextField *magneticVariation;
@property (weak, nonatomic) IBOutlet UILabel *headingCalculated;
@property (weak, nonatomic) IBOutlet UILabel *groundSpeedCalculated;
- (IBAction)calculatePressed:(id)sender;
@end
和
//
// ViewController.m
// WindTriangle
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.windDegrees.delegate = self;
self.windSpeed.delegate = self;
self.courseDesired.delegate = self;
self.trueAirSpeed.delegate = self;
self.magneticVariation.delegate = self;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)calculatePressed:(id)sender {
windDegreesFloat = [_windDegrees.text floatValue];
windSpeedFloat = [_windSpeed.text floatValue];
courseDesiredFloat = [_courseDesired.text floatValue];
trueAirSpeedFloat = [_trueAirSpeed.text floatValue];
magneticVariationFloat = [_magneticVariation.text floatValue];
headingCalculatedFloat = ( courseDesiredFloat - magneticVariationFloat ) + ( 180 / M_PI ) * asin(( windSpeedFloat / trueAirSpeedFloat) * sin(( M_PI * ( windDegreesFloat - ( courseDesiredFloat - magneticVariationFloat))) / 180));
NSString * headingCalculatedString = [NSString stringWithFormat:@"%.1f", headingCalculatedFloat];
_headingCalculated.text = headingCalculatedString;
groundSpeedCalculatedFloat = sqrt(pow( trueAirSpeedFloat , 2) + pow(windSpeedFloat , 2) - (2 * trueAirSpeedFloat *windSpeedFloat * cos((M_PI * ( courseDesiredFloat - windDegreesFloat + ((180 / M_PI) * asin(( windSpeedFloat / trueAirSpeedFloat ) * sin((M_PI * ( windDegreesFloat - courseDesiredFloat )) / 180))))) / 180)));
NSString * groundSpeedCalculatedString = [NSString stringWithFormat:@"%.1f", groundSpeedCalculatedFloat];
_groundSpeedCalculated.text = groundSpeedCalculatedString;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
return [textField resignFirstResponder];
}
@end
我也是StackOverflow的新手。您的意见将不胜感激。
最佳答案
您在这里有几处错误。您的.h文件应为:
//
// ViewController.h
// WindTriangle
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextView *instructionsText;
@property (weak, nonatomic) IBOutlet UITextField *windDegrees;
@property (weak, nonatomic) IBOutlet UITextField *windSpeed;
@property (weak, nonatomic) IBOutlet UITextField *courseDesired;
@property (weak, nonatomic) IBOutlet UITextField *trueAirSpeed;
@property (weak, nonatomic) IBOutlet UITextField *magneticVariation;
@property (weak, nonatomic) IBOutlet UILabel *headingCalculated;
@property (weak, nonatomic) IBOutlet UILabel *groundSpeedCalculated;
- (IBAction)calculatePressed:(id)sender;
@end
您不想声明所有这些不必要的全局变量。您不需要重新定义标准的
M_PI
宏。而且您无需告诉世界您的类符合UITextField
协议。在您的.m文件中,您应该替换为:
@interface ViewController ()
@end
与:
@interface ViewController () <UITextViewDelegate, UITextFieldDelegate>
@end
另外,在为属性之一引用生成的实例变量之一的任何地方,都应更改引用以改为使用该属性。例:
更改:
windDegreesFloat = [_windDegrees.text floatValue];
至:
windDegreesFloat = [self.windDegrees.text floatValue];
在所有使用下划线变量而不是属性的地方都执行此操作。
例如,使用
self.windDegrees.delegate = self;
是为了告诉文本字段您的视图控制器(self
)将处理来自文本字段的事件。