さて、今回からはボタンを押したときの処理(メソッド)『changeGreeting:』をHelloWorldに実装していきます。
凄く短いプログラムだけど、大いに頭を混乱させてくれます。
プログラマの人にはあれ?変じゃね?ってところもあるとは思うけど、ド素人が書いてるので変なところがあったら突っ込んでください。
【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ4【『初めてのiOSアプリケーション』その2】 | naonotes.com(ナオノーツ)プロパティを追加する(プロパティ宣言)
テキストフィールドに記入された文字列を入れるプロパティ(入れ物)を作成する。
Project NavigatorにあるViewController.hをクリック。
@property (weak, nonatomic) IBOutlet UILabel *label;の下に、
@property (copy, nonatomic) NSString *userName;
と書き足す。
NSStringは、文字列を扱いますよ、という意味になる。
これでテキストフィールドに記入された名前を格納するプロパティ『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をクリック。
頭がくらっとくるような奇っ怪なコードが書かれている画面が出てくる。
が、とりあえずこれをすべて理解しようと思わなくていい。
Xcodeが自動生成してくれたんだから気にしない。
深く考えない。
自分で書かなくて済んだ(゚∀゚)!
とポジティブに考えよう。
とりあえず、先ほど宣言したプロパティ『userName』をViewController.mでも使えるようにViewController.hから引っ張り出してくる。
@implementation ViewControllerの下に、
@synthesize userName = _userName;
と入力する。
これでViewController.hのプロパティ『userName』に数値や文字列を格納できるようになった。
なぜこう書くのかはいずれ書くと思うけど、今はプロパティに値を格納するにはこう書くんだと覚えればいい。
深く考えるとブログ主のように何日も悩んだ挙げ句たいして理解も出来ないという泥沼にはまる。
『changeGreeting:』をViewController.mに実装
さて、今回の最大の山場にして、HelloWorldの主要機能、『changeGreeting:』メソッドをViewController.mに実装していきます。
ViewController.mの下の方に、
– (IBAction)changeGreeting:(id)sender {
というコードがあるので、その下にコードを書いていく。
この- (IBAction)〜は、前回ViewController.hにボタンのアクション接続の設定をしたが、それをすると自動でViewController.mに書き込んでくれる。
アクション接続の内容はここに書き込んでね!とXcodeが教えてくれてるって事。
便利だね。
そこに下記コードを記入する。
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;
なんだこりゃ。
何が何だかわかんね。
ってなるけど、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ボタンをクリックすると・・・
おおっ!ちゃんと動いてる!!
テキストフィールドには何も入力されてないからWorldが返されてるね。
だけど、テキストフィールドのキーボードは相変わらず閉じない。
次回はデリゲートのコードを記述
というわけで、次回はキーボードのDoneを押したらちゃんと閉じるように設定してみよう。
って、誰か見てるのかなこの記事。
今日もお疲れさまです。
すみません。もう頭の中●▲■★#$%&です(汗)
初日から読み直し中です(汗)
ありゃw
やっぱりわかりにくいですかね(;´Д`)
とても参考になります。
ありがとうございますヽ(´ー`)ノ
1つ1つ説明してくださっているのでとてもわかりやすいです
(^0^)/
@synthesize userName = _userName;
あたりからエラーが出るなぁ
延々とuserNameが全部エラー
バージョンが違うとなおさらよくわからないや
バージョン違っても変わらないですよ。
初めてのiOSアプリケーションのドキュメントを見て違うところがないか確認してください。
とてもわかりやすいです!
自分もあまり理解してない頃に書いた記事なので稚拙なことこの上ないですが、
喜んで貰えて何よりです。