私はこれを通り抜けて、このようなものを機能させます。また、典型的なObjective-Cの慣例に一致するように、いくつかの名前の大文字と小文字を変更します。気にしないでください。
@interface ViewController : UIViewController {
IBOutlet UILabel *calculatorScreen;
NSDecimalNumber *screen;
}
- (IBAction)digitPressed:(id)sender;
@end
screen妥当な開始値に初期化する必要があります。あなたのクラスはViewControllerなので、それを行うのに適した場所はです-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
}
次に、数字ボタン。10桁のボタンすべてによって呼び出されるメソッドが1つあると予想したのdigitPressed:か、それともボタンの1つだけに対して呼び出されるはずだったのかは不明です。まず、ボタンごとに個別のアクションを実行するのが最も簡単です。
「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];
}
等々。ビューコントローラで「1」、「2」、「10」を覚えておく必要はありませんでした。必要なときに作成し、使い終わったら割り当てを解除することができます。(はい、少し非効率的ですが、これらのオブジェクトは小さくて軽量です。毎秒何千ものオブジェクトを作成でき、誰も気付かないでしょう。)
あなたの次の質問:10個の別々の「数字」アクションを持つのはばかげていませんか?はい。代わりに、送信者を調べ、それがどのボタンであるかを判断し、正しいことを実行する1つの「digitPressed」アクションを実行できます。
どのボタンがどれであるかを簡単に見分ける方法:ボタンを作成するときに、tagその数字と同じになるように設定します。これは、コードまたはInterfaceBuilderで設定できます。次に、アクションメソッドは送信者のタグを検索します。
- (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];
}