我会通过并让这些东西工作。另外,我将更改您的某些名称的大小写以匹配典型的 Objective-C 实践——希望您不介意。
@interface ViewController : UIViewController {
IBOutlet UILabel *calculatorScreen;
NSDecimalNumber *screen;
}
- (IBAction)digitPressed:(id)sender;
@end
您需要初始化screen
为一个合理的起始值。因为你的类是一个视图控制器,所以这样做的好地方是-viewDidLoad
.
- (void)viewDidLoad
{
[super viewDidLoad]; // in case your superclass needs to do any work
screen = [NSDecimalNumber zero];
// also, make sure it shows up in the UI
calculatorScreen.text = [screen stringValue]; // Convert from NSDecimalNumber to NSString, and pushes it into the label
}
接下来是数字按钮。目前尚不清楚您是否希望有一种digitPressed:
方法被所有 10 位按钮调用,或者它是否应该只用于其中一个按钮。首先,最简单的方法是为每个按钮单独操作。
这是“1”按钮的方法:
- (IBAction)digit1Pressed:(id)sender {
// Create intermediate values
NSDecimalNumber* one = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:NO]; // 1 * 10^0 = 1
NSDecimalNumber* ten = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:1 isNegative:NO]; // 1 * 10^1 = 10
// Compute the new result
NSDecimalNumber* result = [[screen decimalNumberByMultiplyingBy:ten] decimalNumberByAdding:one];
// Put the result back in the screen
screen = result;
// and update the UI
calculatorScreen.text = [screen stringValue];
}
同样,“2”按钮将连接到此操作:
- (IBAction)digit2Pressed:(id)sender {
NSDecimalNumber* two = [NSDecimalNumber decimalNumberWithMantissa:2 exponent:0 isNegative:NO]; // 1 * 10^0 = 1
NSDecimalNumber* ten = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:1 isNegative:NO]; // 1 * 10^1 = 10
// take a shortcut and don't bother with the `result` variable
screen = [[screen decimalNumberByMultiplyingBy:ten] decimalNumberByAdding:two];
calculatorScreen.text = [screen stringValue];
}
等等。请注意,我们不必在视图控制器中记住“一”、“二”和“十”——我们可以在需要它们时创建它们,并在使用完它们时释放它们。(是的,它的效率稍微低一些,但是这些对象又小又轻;你每秒可以创建数千个,但没人会注意到。)
您的下一个问题:拥有 10 个单独的“数字”动作不是很愚蠢吗?是的。您可以改为使用一个“digitPressed”操作来查看发件人,确定它是哪个按钮,然后做正确的事情。
区分哪个按钮是哪个按钮的简单方法:创建按钮时,将其设置tag
为与其数字相同。您可以通过代码或在界面构建器中进行设置。然后,action 方法查找发送者的标签。
- (IBAction)digitPressed:(id)sender {
NSDecimalNumber* digit = [NSDecimalNumber decimalNumberWithMantissa:[sender tag] exponent:0 isNegative:NO]; // digit * 10^0
NSDecimalNumber* ten = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:1 isNegative:NO]; // 1 * 10^1 = 10
screen = [[screen decimalNumberByMultiplyingBy:ten] decimalNumberByAdding:digit];
calculatorScreen.text = [screen stringValue];
}