Objective-C MVCまたはiOS 5用の計算機

背景



最近、デバイスを使ってギアを始めたという事実に勇気づけられたので、デバイス用のプログラミング方法を学ぶことにしました。 もちろん、これはWeb開発者として選択した道ではあまり役に立ちませんが、新しい言語は常に私にとって興味深いものでした。



私が最初に思いついたのは、iTunesUバーチャルスクールでした。 ここで、私はスタンフォード大学でアップルのデベロッパーによって教えられたCS 193Pコースに関する講義を見つけました。 講義は、言語とネイティブフレームワークの基本的な機能を非常によくカバーしていますが、英語の講義と翻訳はありません。 私にとって個人的には、これは問題を引き起こしませんでした。Apleはこれらの講義に適した候補者のみを選択しているようです。 。



Xcodeの新しいバージョンが毎年リリースされており、現在のバージョンに関するスタンフォード大学の講義は学期の後半に利用できるため、私はこのコースの実用的な部分(!)に進む一連の記事を書くことにしました。 2010年秋の講義を聞いたので、元々バージョン3向けに開発されたxcode 4.2でプログラムを書くことは実際に役に立ちます。 ここでは、ObjCの詳細については掘り下げませんが、裸の練習をします。



それでは始めましょう



仕事にはXcode 4.2、iOS SDK 5を使用します。これらはすべてMac OS X 10.7.2 Lionで動作します。

タイトルから気づくように言われたように、私(講師を読む)はMVCデータモデルを使用します。 一般的に、正直に言うと、iOS向けに別の方法でコーディングする方法を理解していません。 プログラム計算機を作成します。 数値の平方根を加算、減算、乗算、除算、抽出するシンプルな計算機。

プログラムの構造は次のとおりです。

1.すべてのアクション(脳のクラス)を実行する計算機の頭脳があります-モデル;

2.ボタンのクリックを処理するコントローラーがあります。

3.新しく作成されたiOSエンコーダーには常に問題があるビューがあります。 これについては後で詳しく説明します。



新しいプロジェクト



そこで、まずはproctを作成します。 これを行うには、[ファイル]-[新規]-[新しいプロジェクト]に移動します。 テンプレートの全セットの中から、「シングルビューアプリケーション」を選択します。 Calcアプリケーションに名前を付けます。 また、プロジェクトを作成するときに、「ストーリーボードを使用する」のチェックを外したことも注目に値します。 これが必要な理由:SDK 5では、古い.xibの代わりに、新しい.storyboardフォーマットが登場しました。 それらがどのように異なるか、私はまだそれを理解していないので、私はIBの昔ながらのxibファイルを使用します(以降はInterface Builder)。



そこで、プロジェクトを作成しました。 すでにコントローラーとビューがあります。 システム全体のパフォーマンスをテストするために、トライアルビルドを作成できます。 すべてが正常であれば、iPhoneエミュレーターが画面に表示され、アプリケーションは灰色の画面で起動します。



まず、すべてのオプションを実行する計算機(プロセッサ)の頭脳が必要です。 CMD + Nを押して、Objective-Cクラスを選択し、NSObjectクラスのCalcBrainサブクラスと呼んで、脳が基本的なメソッドを継承するようにします。 プロジェクトには、CalcBrain.hとCalcBrain.mの2つのファイルが追加されました。



ViewController.hに進みましょう。 そこには、標準UIKitライブラリのインポートとコントローラー自体の宣言以外は何も表示されません。 ここでは、次のことを宣言する必要があります。



-アウトレット:Interface Builderの特定の要素にチュークされる変数。

-アクション:IB要素が特定のアクションを実行するときに呼び出される適切なメソッド。

-また、このCalcBrainクラスの変数を宣言して、この全体を機能させる必要があります。



行きましょう。



#import <UIKit/UIKit.h> #import "CalcBrain.h" @interface ViewController : UIViewController { IBOutlet UILabel *display; CalcBrain *brain; } -(IBAction)digitPressed:(UIButton *)sender; //++ -(IBAction)operationPressed:(UIButton *)sender; //++ @end
      
      







コードは直感的に理解できるため、ここでは何も説明しません(そうでない場合は、まず、OOPとプログラミングの世界のその他の利点について読むことをお勧めします)。



インターフェース構築



次に、コードから少し脱線し、インターフェースを作成します。 私の経験では、アクションの直接的なデモンストレーションなしの多くの初心者コーダーがちょうど正確に落ちたので、私は今、あなたのすべての注意を集中する必要があると信じています

この段階で、彼らの手を落としました。 ViewController.xibを開き、既存のオブジェクトを確認します。

ファイルの所有者-指定されたxibが属するクラスを指すオブジェクト(この場合、ViewControllerです-これは、このコントローラーのみのアクションとアウトレットしか使用できないことを意味します)。

最初の応答

ビュー-コントローラーを直接表示します。



まず、ボタンを作成します。 数字から始めましょう。



画像



将来的には7桁になる最初の数字を作成します。



画像



さらに苦しまないために、すぐにdigitPressedアクションをボタンにバインドします。 これを行うには、ボタンを選択し、Connections InspectorでTouch Downイベントの反対側にある三つ編みを取り、それをFile's Ownerオブジェクトにドラッグします。



画像



ボタンがタッチされたときにコントローラーが応答するアクションを選択できるウィンドウが表示されます。



画像



digitPressedが必要になります。

残っているのは、Alt(オプション)を押したまま「ボタンテンプレート」を作成することです。 これで、番号にラベルを設定できます。 これは、属性インスペクターを使用するか、ボタンをダブルクリックして実行できます。 また、一部を小数部分から分離するためのボタンが1つあることを忘れないでください(これは、ロシアの場合のように記号「。」ではなく「。」で行います)。



画像



同様に、操作ボタンを作成します。 平方根の加算、減算、除算、乗算、および抽出を理解します。 そして、別の等号はアクションの結果を出力します。 それだけです これで入力デバイスができました。 出力デバイスは表示デバイスです。 Labelオブジェクトを作成し、それを左に揃え、フォントを26に設定し、デフォルトのテキストを「0」にする必要があります。 複雑なことは何もありません。



画像

画像



コーディングを続けます



インターフェイスはもう扱いません。 きれいなコードのまま。

ところで、興味があれば、アプリケーションを実行して、エミュレータでどのように見えるかを確認できます。

脳を書き始めましょう。 次のように機能します。

1オブジェクトは最初のオペランドを受け取ります。

2オブジェクトはアクションを受け取ります。

3アクションが平方根を取っていない場合、次のオペランドを受け取る準備をしています。

4ルートまたは同等に出力される結果の場合。



CalcBrain.hファイルのテキスト



 #import <Foundation/Foundation.h> @interface CalcBrain : NSObject { double operand; } -(void)setOperand:(double)aDouble; -(double)performOperation:(NSString *)operation; @end
      
      







オペランド変数については、説明する必要はありません。 クラスメソッド-すべてはただsetOperandであり、オペランド変数の通常のセッターです。 @syntesuzeを使用することもできますが、その後、必要のないゲッターが生成されます。 それで、そのような松葉杖と仲良くしましょう。 次に、すべての方法を説明します。



 - (void)setOperand:(double)aDouble{ operand = aDouble; } - (double)performOperation:(NSString *)operation{ if ([operation isEqual:@"sqrt"]) { operand = sqrt(operand); } return operand; }
      
      







2番目の方法について少し。 2番目のメソッドはアクションを処理します(実際には操作要求はそれと呼ばれます)。 これまでのところ、平方根抽出を処理しています。 このメソッドへの入力は、操作ボタンからのテキストになります。 次に、第2オペランドを記憶する前に、脳が第1オペランドと押された操作を記憶する必要があるという事実と格闘します。



クラスを追加しましょう:

 @interface CalcBrain : NSObject { double operand; NSString *waitingOperation; double waitingOperand; }
      
      







そして説明:



 - (double)performOperation:(NSString *)operation{ if ([operation isEqual:@"sqrt"]) { operand = sqrt(operand); } else { [self performWaitingOperation]; waitingOperation = operation; waitingOperand = operand; } return operand; }
      
      







複数のオペランド(sqrt)にアクションがある場合、performWaitingOperationメソッドはオペランドに対してアクション自体を直接実行します。



 -(void)performWaitingOperation { if ([@"+" isEqual:waitingOperation]) { operand = waitingOperand + operand; } else if ([@"*" isEqual:waitingOperation]) { operand = waitingOperand * operand; } else if ([@"-" isEqual:waitingOperation]) { operand = waitingOperand - operand; } else if ([@"/" isEqual:waitingOperation]) { if (operand) { operand = waitingOperand / operand; } } }
      
      







CalcBrain.hでこのメソッドを宣言するのを忘れられない



プログラマブルコントローラー



誇りに思います。 ただし、コントローラー、特にヘッダーファイルに移動します。 すでに宣言されているメソッドの説明を始めましょう。 ちなみに、XcodeがViewController.mファイルで作成したものはすべて消去できます。 またね このアプリケーションでは、それらは必要ありません。 必要なもの:



 #import "ViewController.h" @implementation ViewController -(IBAction)digitPressed:(UIButton *)sender { } -(IBAction)operationPressed:(UIButton *)sender { } @end
      
      







それでは、メソッドを見ていきましょう。 操作をクリックすると、ボタンからテキストを取得する必要があります。 これは単純に行われます:すべてのパラメーターを持つオブジェクトとしてのボタンはメソッドに分類されます:



 -(IBAction)operationPressed:(UIButton *)sender { NSString *operation = [[sender titleLabel] text]; }
      
      







次に、この操作を実行するように脳に要求する必要があります。 しかし、最初に、これらの脳を作成する必要があります。 それらに変数を割り当てましたが、まだ発表していません:



 -(CalcBrain *)brain { if (!brain) brain = [[CalcBrain alloc] init]; return brain; }
      
      







そして、操作を押すメソッドを追加し、参照リクエストを作成して結果を表示します。



 -(IBAction)operationPressed:(UIButton *)sender { NSString *operation = [[sender titleLabel] text]; double result = [[self brain] performOperation:operation]; [display setText: [NSString stringWithFormat:@"%g", result]]; }
      
      







今、論理的な問題が発生します-ユーザーが「5」「5」を押すと、彼は私たちの脳が今理解している「5」ではなく「55」を意味します。 つまり、ユーザーが入力プロセスにいるかどうかを識別するブール変数が必要です。



 @interface ViewController : UIViewController { IBOutlet UILabel *display; CalcBrain *brain; BOOL userIsInTheMiddleOfTypingANumber; }
      
      







操作キーを押したときにオペランドの宣言を記述できるようになりました。



 -(IBAction)operationPressed:(UIButton *)sender { if (userIsInTheMiddleOfTypingANumber) { [[self brain] setOperand:[[display text] doubleValue]]; userIsInTheMiddleOfTypingANumber = NO; } NSString *operation = [[sender titleLabel] text]; double result = [[self brain] performOperation:operation]; [display setText: [NSString stringWithFormat:@"%g", result]]; }
      
      







次に、数字のクリックについて説明します。



 -(IBAction)digitPressed:(UIButton *)sender { NSString *digit = [[sender titleLabel] text]; if (userIsInTheMiddleOfTypingANumber) { [display setText:[[display text] stringByAppendingString:digit]]; } else { [display setText:digit]; userIsInTheMiddleOfTypingANumber = YES; } }
      
      







ここでのロジックは簡単です。送信者ラベルから番号を取得します。stringByAppendingStringがtrueの場合、入力した番号をディスプレイに添付する必要があります。 そうでない場合は、ディスプレイに数字を追加して、stringByAppendingStringパラメーターをクリックします。



ビルドと実行のみが残ります。



画像



宿題



次の3つの機能を追加できます。

シスルを負から正に変える関数±。

リセットリセット機能(C);

そして、操作を繰り返す機能(操作を行ってからもう一度押すと、最後のオペランドを持つ最後の操作が繰り返されます);



All Articles