【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ5【『初めてのiOSアプリケーション』その3】

Xcode


さて、今回からはボタンを押したときの処理(メソッド)『changeGreeting:』をHelloWorldに実装していきます。

凄く短いプログラムだけど、大いに頭を混乱させてくれます。

プログラマの人にはあれ?変じゃね?ってところもあるとは思うけど、ド素人が書いてるので変なところがあったら突っ込んでください。


【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ4【『初めてのiOSアプリケーション』その2】 | naonotes.com(ナオノーツ)


プロパティを追加する(プロパティ宣言)


テキストフィールドに記入された文字列を入れるプロパティ(入れ物)を作成する。

Project NavigatorにあるViewController.hをクリック。


skitchphkNXL



@property (weak, nonatomic) IBOutlet UILabel *label;の下に、

@property (copy, nonatomic) NSString *userName;

と書き足す。

NSStringは、文字列を扱いますよ、という意味になる。


skitchwBs177



これでテキストフィールドに記入された名前を格納するプロパティ『userName』が作成された。



ViewController.hとViewController.mの違い


ViewController.hの拡張子、.hはヘッダー(header)のh。

ヘッダーではボタン等でのアクション情報や、各プログラムに処理結果を渡したり受け取ったりと、管理者のような働きをする。

会社でいうと役員。


ViewController.mの拡張子、.mは・・・なんの略なんだろう?メソッド?w

ViewController.hから引き渡された数字などの情報を元にViewController.m内で処理を行って再びViewController.hへ返す。

会社でいうと実務を行う従業員。



@synthesize


@synthesizeを記述する。

@property(プロパティ宣言)で作成された入れ物『userName』に処理結果を格納するために記述する。

Project NavigatorにあるViewController.mをクリック。


skitchZeTT89



頭がくらっとくるような奇っ怪なコードが書かれている画面が出てくる。


skitch6DOBaw


が、とりあえずこれをすべて理解しようと思わなくていい。

Xcodeが自動生成してくれたんだから気にしない。

深く考えない。

自分で書かなくて済んだ(゚∀゚)!

とポジティブに考えよう。


とりあえず、先ほど宣言したプロパティ『userName』をViewController.mでも使えるようにViewController.hから引っ張り出してくる。

@implementation ViewControllerの下に、

@synthesize userName = _userName;

と入力する。


skitch6NTqFO



これでViewController.hのプロパティ『userName』に数値や文字列を格納できるようになった。

なぜこう書くのかはいずれ書くと思うけど、今はプロパティに値を格納するにはこう書くんだと覚えればいい。

深く考えるとブログ主のように何日も悩んだ挙げ句たいして理解も出来ないという泥沼にはまる。



『changeGreeting:』をViewController.mに実装


さて、今回の最大の山場にして、HelloWorldの主要機能、『changeGreeting:』メソッドをViewController.mに実装していきます。


ViewController.mの下の方に、

– (IBAction)changeGreeting:(id)sender {

というコードがあるので、その下にコードを書いていく。

この- (IBAction)〜は、前回ViewController.hにボタンのアクション接続の設定をしたが、それをすると自動でViewController.mに書き込んでくれる。

アクション接続の内容はここに書き込んでね!とXcodeが教えてくれてるって事。

便利だね。


skitchEMMqmM



そこに下記コードを記入する。


self.userName = self.textField.text;
NSString *nameString = self.userName;
if ([nameString length] == 0) {
nameString = @”World”;
}
NSString *greeting = [[NSString alloc] initWithFormat:@”Hello, %@!”, nameString];
self.label.text = greeting;


skitch9eMpz6



なんだこりゃ。

何が何だかわかんね。

ってなるけど、1行ずつ書いている内容を説明するので、おぼろげながらでもいいので理解していこう。



self.userName = self.textField.text;


この行は、テキストフィールドに入力された文字列を先ほどプロパティ宣言で作った入れ物『userName』に格納する(代入)、という意味。

『self.プロパティ』と記述することで、直接プロパティからデータを引っ張り出したり格納できる。

ブログラムでは何でもそうなんだけど、=はイコールという意味では使われない。

A=Bで、AにBを代入する、という意味になる。

そういうもんだと思って覚えてほしい。

ちなみにイコールとして使う場合は==と2つ並べる。



NSString *nameString = self.userName;


ここの行では、文字列(NSString)を格納する入れ物『nameString』を作り、プロパティ『userName』の内容を代入している。

重役用書類を勝手に書き換えるとまずいので、コピーしとこうっていう感じ。



if ([nameString length] == 0) {
nameString = @”World”;
}


出てきました。

if文です。

プログラム初心者の味方。

そしてプログラムの基本でもあります。

『もし〜なら〜をする。違うなら〜をする。』

という感じで使う。

しかし、これに頼りすぎるとトーシロ扱いされるというなかなの理不尽さも備えてます。


さて1行目、


if ([nameString length] == 0) {


これは、もしnameStringの中身の文字数(length)が0文字の場合、以下の処理を行う。

という意味。

nameStringはさっきuserNameを代入したものだから、テキストフィールドに何も入力されていない場合、って事だね。


2行目、


nameString = @”World”;


これは、nameStringにWorldという文字を代入する、という意味。

Objective-Cでは画面にテキストを出力する場合、@”出力したいテキスト”という風に書く。

これは決まり事なので、そういうもんだと思って覚えてください。


if文全体で、もしテキストフィールドに何も入力されていなかった場合、『nameString』にWorldというテキストを代入しなさい。っていう意味になる。



NSString *greeting = [[NSString alloc] initWithFormat:@”Hello, %@!”, nameString];


ちょっと長めだね。

『greeting』という文字列を入れる入れ物を作り、それにHelloと『nameString』の中に入っているテキストをくっつけて(initWithFormat)、『greeting』に代入しなさい、という意味になる。

[NSString alloc]の意味は、今回、initWithFormat:によって作られる文字数がわからない。

ユーザー名は人によって違うからね。

だけど、文字を画面に表示するときは、表示用に領域(メモリ)を確保しなきゃならない。

テーブルに料理を並べるように。

allocは文字数にあわせた領域を自動で確保してくれる優れもの。

お客さんの人数によって最適なテーブルの大きさを選んでくれる優れたホールの人って感じ。


%@は、NSString型の入れ物に入れられた文字を表示するっていう意味。

なので、テキストフィールドにkyoji kuzunohaと入れると、Hello,kyoji kuzunoha!と返す、って事になるね。

テキストフィールドに何も表示されていないと、Hello,World!と返す。



self.label.text = greeting;


これは前回アウトレット接続したlabelに『greeting』の中身を引き渡して画面に表示させる、という処理になる。


一見チンプンカンプンでも、分けてみてみると何となく意味がわかるでしょ?



シミュレータで確認してみよう


シミュレータを起動してみよう。

Helloボタンをクリックすると・・・


skitchyOUDVf



おおっ!ちゃんと動いてる!!

テキストフィールドには何も入力されてないからWorldが返されてるね。


skitchlPcLae



だけど、テキストフィールドのキーボードは相変わらず閉じない。


skitchC3dsf8



次回はデリゲートのコードを記述


というわけで、次回はキーボードのDoneを押したらちゃんと閉じるように設定してみよう。

って、誰か見てるのかなこの記事。


【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ5【『初めてのiOSアプリケーション』その3】」への10件のフィードバック

    1. 葛葉 キョウジ(管理人) 投稿作成者

      ありゃw
      やっぱりわかりにくいですかね(;´Д`)

      返信
  1.  

    @synthesize userName = _userName;
    あたりからエラーが出るなぁ
    延々とuserNameが全部エラー
    バージョンが違うとなおさらよくわからないや

    返信
    1. 葛葉 キョウジ(管理人) 投稿作成者

      バージョン違っても変わらないですよ。
      初めてのiOSアプリケーションのドキュメントを見て違うところがないか確認してください。

      返信
    1. 葛葉 キョウジ(管理人) 投稿作成者

      自分もあまり理解してない頃に書いた記事なので稚拙なことこの上ないですが、
      喜んで貰えて何よりです。

      返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)