さて、初めてのiOSアプリケーションをも終わったので、自分でアプリを作ってみることにした。
無謀。
とりあえず計算機でも作ってみるか、と軽い思いつきでやってみたら難しい・・・。
試行錯誤しまくり、七転八倒しながら計算機を作る奮闘記化します。
今回はボタンを押した回数をカウントするコードを書きます。
Xcode | naonotes.com(ナオノーツ)新規でプロジェクト、Calcを作成
新規プロジェクトを作成する。
名前は計算機なんでCalcで。
プロジェクトの作成は何度もやったから特には書かない。
ラベルとボタンを配置
数値出力用のラベルを配置。
MainStoryboard_iPhone.storyboardを開き、ViewControllerにLabelをドラッグアンドドロップし、Textの下のボックスを0に、FontはSystem30に、Alignmentを右寄せにした。
ボタンはとりあえず1だけ配置。
Titleの下のBoxに1、FontはSystem Bold 30.0に、大きさは適当な正方形にした。
いっぱい置くとノータリンの自分が混乱するw
ViewControllerに接続
各UIをcontrolキーを押しながらViewControllerに接続する。
ボタンはアクション接続、ラベルはアウトレット接続。
名前(インスタンス変数名)はボタンをinputNumber1、ラベルをnumberOutputにした。
ViewController.mにコードを入力
さ!コードを入力!と思ったけど、思い浮かばん。
が、初めてのiOSアプリケーションのコードを必死に応用して書いてみた。
ViewController.mを開き、
– (IBAction)inputNumber1:(id)sender {
の下にコードを記述。
– (IBAction)〜はボタンをアクション接続したときに勝手に書き込まれる。
– (IBAction)inputNumber1:(id)sender {
NSInteger num1 = 1;
NSString *print = [[NSString alloc] initWithFormat:@”%d!”, num1];
self.numberOutput.text = print;
}
NSIntergerは数字を格納できる型らしいのでそれを使ってみた。
変数num1作成時、変数名の頭に*がついてないけど、NSIntergerにはいらないらしい。
これもそうなんだと覚えるしかない。
理不尽。
変数num1に1を代入して、Labelに出力するように書き込む。
この辺は初めてのiOSアプリケーションを丸パクリ。
これでシミュレータを起動してボタンをクリックしてみる。
お、おおおお!
でた!
でおった!
1と表示されおった!
との喜びもつかの間、何度1ボタンを押しても1。
11とか111にはならない。
そりゃそうだ。
ボタンを何度クリックしたところでLabelに1が代入されるだけだもんな。
アルゴリズムを考える
とりあえず何が必要なのか考える。
計算機のボタンは、1を1回押したら1、1を2回押したら1+10、3回押したら1+10+100されなきゃいけないのか・・・。
計算機を使ってるときは意識したこともなかったわ。
というわけで、
1.ボタンを押した回数を記憶する入れ物をつくる。
2.ボタンを押した数だけ桁を上げる。
と、適当にアルゴリズムを決めて実行してみる。
ボタンを押した数をカウント
とりあえず、ボタンを押した回数を記憶しなきゃならないので、プロパティ(入れ物)countButtonを作る。
押した回数は共有できるように、メソッドinputNumber1の変数内に格納しないでヘッダーViewController.hで格納するようにする。
ボタンを押した回数は1以外のボタンでも使うからね。
イメージとしてはこんな感じ。
プロパティ宣言
プロパティ宣言をして入れ物(インスタンス変数)を作成。
ViewController.hの@interface〜以下に下記を書き込む。
@property (nonatomic, assign) NSInteger countButton;
(nonatomic, assign)はブログ主もイマイチよく解ってない。
適当。
ViewController.mでプロパティcountButtonを使えるようにする。
ViewController.mを開き、@implementation ViewControllerの下に
@synthesize countButton;
と記述する。
これでプロパティcountButtonはViewController.mで使えるようになった。
おなじようにしてcountNumberも作った。
わかりにくければ、初めてのiOSアプリケーション編に詳しく書いているのでそれを参照してください。
inputNumber1メソッドに追記する
ボタンを押すたびにメソッドinputNumber1が流れるので、流れるたびに1がcountButtonに足されるように記述。
– (IBAction)inputNumber1:(id)sender {
NSInteger num1 = 1;
self.countButton = self.countButton + 1;
NSString *print = [[NSString alloc] initWithFormat:@”%d!”, num1];
self.numberOutput.text = print;
}
でもこれだけだとボタンを押すたびにcountButtonに1がプラスされているかわからないので、ログで確認できるようにする。
さっき記述したself.countButton = self.countButton + 1;の下にLog確認用のコードを記述する。
– (IBAction)inputNumber1:(id)sender {
NSInteger num1 = 1;
self.countButton = self.countButton + 1;
NSLog(@”%d”,countButton);
NSString *print = [[NSString alloc] initWithFormat:@”%d!”, num1];
self.numberOutput.text = print;
}
これで変数countButtonの中身がログで見られるようになった。
シミュレータで確認してみよう
ログを確認できるようにDebug areaを表示する。
画面右上にあるViewの真ん中にあるHide or show the Debug areaをクリック。
すると下からにょきっとデバッグエリアが出てくる。
ここにNSLogでの結果が表示される。
NSLog(@”%dまたは%@”,変数);で変数の内容をログに表示する。
%dは数値、%@はテキストを表示。
とりあえず動かしてみよう。
エミュレータを起動し、1ボタンを押しまくってログを見てみると・・・
おおお!ちゃんと足していってる!
すげえ!
が、ラベルは1のまま。
ボタンを押した回数をカウントする処理を記述してないから当然だね。
アルゴリズムにミスが・・・
お、これはいけるんじゃね?
さくさく桁数を足していくプログラムを記述していくとするか!
とこの時は思っていた。
アルゴリズムに重大な間違いがあるとも気づかずに・・・。
次回へ続く。
MainStoryboard_iPhone.storyboard がどこにあるのか分かりません
教えてください
すいません。
画像の-(void) configureViewはどこから来たんですか?エラーが出てしまいます。
それと、1ではなく!1と表示されてしまいます。
-(void) configureView;
は使ってないみたいなんで消していいです。
1はどこのことか書いてないとわかりません。