总体而言,我对 Objective-C 和 iOS 开发还很陌生。本周,经过一番努力,我设法让一个小应用程序在模拟器中正常运行。
我通过阅读 Matt Neuburg 的“iOS 7 Programming Fundamentals”、在线教程中的说明以及本网站上的建议来学习编程语言的基础知识。
我编写的代码(显然)可以工作,但我不完全理解为什么我需要对我的代码进行一些调整才能使其工作。
该应用程序是解决“风三角”的基本应用程序,供您引用。它所需要做的就是将一些用户定义的变量放入正确的公式中,然后显示结果。
我已经复制了 .h 和 .m 文件。简单地说:.h 声明了 7 个变量;文本字段中的 5 个用户输入; 2 个标签显示 2 个计算结果;启动计算操作的一个按钮。
下面的代码,我看不懂:
为什么我被迫在实现中使用下划线声明我的变量
为什么我在加载 View 后被迫为变量声明 .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 的新手。您的意见将不胜感激。
最佳答案
您好,对于您的第一个问题,下划线表示实例变量。以前,您无法在 objective-c 中执行此操作。如果你声明了一个属性,你必须在合成后通过 self.property 调用它。所以下划线只是调用一个实例。
至于第二个问题,当您在这种情况下设置委托(delegate)时,您实际上是将 UITextField 的 IBOutlet 委托(delegate)设置为您在其中键入代码的 View Controller 。委托(delegate)负责 Controller 之间的交互和 View 。这允许 View Controller 管理 UITextFieldDelegate 的某些方法
关于ios - 不确定公共(public)或私有(private)变量声明和自委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20524457/