[Powered by Google Translate] [セミナー] [IOS:ボスのようなアプリを書く] [トミーM​​acWilliam] [ハーバード大学] [これはCS50です。] [CS50.TV] すべての権利は​​、誰に、iOSへの歓迎:ボスのようなライティングアプリ。 このセミナーでは、iPhone用アプリの作成に集中しようとしている そして今度はiPad用のアプリを書くので、私たちは基本的にウォークスルーするつもりだ アプリを作る方法のカップル異なる例、Tic Tac Toeのような簡単なゲーム、 または、ニュースリーダーのいくつかの種類のようなアプリを作ることでより興味があるなら または私もそのことについてお話しますインターネットとやり取り何か。 ここに私たちの簡単な議題だ。 iOSアプリは、Objective-Cのと呼ばれる言語で書かれています やので、これは、C言語に似ていますが、しない本当にまったく少しです ので、我々は言語そのものについて少しお話します その後どのようにXCodeのと呼ばれるこのアプリのプログラムを使用して、iPhoneアプリを構築するためには、 あなたがまだそれをダウンロードしていない場合はどの今ダウンロードを開始して自由に感じる。 それは、数ギガバイトだ。 これは、App Storeで無料であるべきなので、Macを持っている必要があります 理想的にはOS Xの最新バージョンを実行して あなたがわからない場合は、問題ありません。 私達はあなたの使用のために利用可能な科学センター内のMacを持っている Xcodeをインストールした、というような開発のためのそれらを使用して自由に感じる。 あなたはアプリを作成したいが、Macを持っていない場合は、心配しないでください。 そのためのキャンパス資源がたくさんあり​​ます。 それで、我々はあなたが作るこ​​とができ、異なるアプリケーションの2より大きい例をカバーするつもりです。 Objective-CはCのスーパーセットと呼ばれるものであり、技術的に それは、任意のCコードも有効なObjective-Cのコードであることを意味します。 我々はダクトの種類がCにいくつかの追加機能にテープで留めていることを意味します これらの機能のいくつかは、これまでに神に感謝し、再度malloc関数を記述することではない含む それらの愚かなポインタとそれらを解放するとすべてのものを心配することはありません あなたは、Cについて憎み、それがObjective-Cで行ったようなものだ。 さて、Objective-Cはまた、はるかに大きな標準ライブラリを持っている ので、Objective-Cのフリー内部のために得る、より多くの機能があります。 我々は我々が行ったから気づいPHPを書いていたときのことを覚えて あなたが行うことができますすべてのこれらの狂気の事の巨大なライブラリにこの最小の言語。 同じことは、iOSで行われます。 そこに仏教のカレンダーのようなもののためのオブジェクトだし、本当に何 あなたはおそらく、おそらくObjective-Cの実装ですでに存在していると考えることができます。 Objective-Cの客観的な部分は何かを参照しています オブジェクト指向プログラミングと呼ばれる。 これは新しい概念の一種であるが、我々は実際にほとんど学んだ すでに、これらの概念の多く。 オブジェクト指向プログラミングの背後にある考え方は、構造になるだろうということです これらのものの周りにあなたのコードの多くは、クラスと呼ば そして、これらのクラスは、本当に構造体をあがめている。 構造体の内部では、基本的にここで言われた、ものです そしてこのことは、メンバーを持つことができます。 たとえば、リンクリスト内のノードは、他のものを持つことができ 値のように、リスト内の次のノードへのポインタ、 と一緒にポインタと、その値は構造体のこのつのインスタンスを構成している。 を除いたクラスは、非常に類似している クラスでも、それらの内部機能を持つことができます。 我々にはstructが宣言されたとき、我々は唯一のint nまたは次のノード*を言うことができます。 今のObjective-Cで、私たちは実際に関数を置くことができます それらのものの内側。 クラスが行うことができますもう一つは、彼らが他のクラスからのデータを継承することができますです。 例えば、私たちは、組み込みのObjective-Cクラスの束を見ることになります。 そのうちの一つは、画面のビューを表すクラスである場合もあり そしてそう言って、私は私自身のビューを実装したい 我々は基本的にAppleの上の誰か、おそらく本当に素敵な人を言う 私のためにこのクラスを書いて、それはボタンを表示するようなものを処理する または画面をレンダリングする、我々は本当に苦しそうになる すべてその機能自分自身を実装するなど、単純で データ継承する私たちは、あなたがそのクラスでやったすべてのことを言うことができます 私はまた、私のクラスの内部で欲しいし、私は、いくつか他のものをするつもりです つまり、アプリを実装しています。 それはのその言葉の継承が何を意味するのか。我々は、より具体的な例を紹介します。 そして最後に、オブジェクト指向プログラミングに鍵があることを それはデータのカプセル化につながる。 我々の問題のうちのいくつかでは、我々はこれらの大きい、グローバル変数を及ぼす可能性があります設定 そしてどこでもグローバル、それは我々が状態を追跡したい方法です。 クラスとは、オブジェクトの内部情報をカプセル化して起動することができます。 我々は我々のアプリの1つの画面を持っている場合、私たちは本当にから任意のデータを持っている必要はありません その我々のアプリの内部で別の画面、 などのクラス内で物事をカプセル化することで、これは実際につながる より良いコード設計に、これは付加的な機能のいくつかを持つことが可能です Objective-Cの。 事前警告は、Objective-Cの構文は、バナナです。 それは、今まで見てきた何のようである ので、それに慣れるには学習曲線の少しです これは一体何を意味するのでしょうか? しかし、一度はそれが本当に、本当に滑らかな初期の学習曲線という過去の取得 アプリの書き込みを開始する。 ここで言っても、クラスを宣言することは、私のクラスであり、それが存在する、 そしておそらくここで私が後で定義するつもりだいくつかのものがある 私は@インタフェースを言うつもりです。 私は@インタフェースを言うつもりです。私はクラスの名前を与えるつもりだ。 し、その後どこかに私は@終わりを言おうとしてんだけど、 @インターフェイスと@ endの間に、すべて 私のクラスになるだろう。 それは私たちのhファイルの中身になるだろう。 ちょうどCのような私達。hファイルは基本的に存在することになり、いくつかの物事がここで述べている。 私は必ずしも、彼らはまだやるべきことを語っていないよ コンパイラは、彼らが存在していることを知っている必要があります。 後で内側にObjective-Cのための私達。mファイル-mのため 我々は実際にこれらのクラスは何をすべきかを定義しようとしているところです。 ずっと私たちのcファイルのように、我々は関数の実装を提供しました。 私たちの。メートルの内側に私たちがここで言おうとしているファイルには、どのようなすべての関数である 私のクラス彼らはすべてやるの内側。 そして最後に、我々はそれらの中括弧の中に言うことができる構造体の内部 int型のnまたはノード*次回、 とObjective-Cで我々は、キーワード@プロパティを使用するつもりだ、 これは、プロパティを定義するために何が起こっているのです 私のクラスの一部であるか、非機能。 Objective-Cの関数を呼び出すこともバナナです。 我々はC言語の関数を宣言したとき、我々はint fooのような何かを言った その後括弧オープンではそれを引数のリストを与えた。 これは、メソッドや関数を宣言するには、Objective-Cのように見えるものです。 私は、関数やメソッドを宣言する場合 私は方法は、本当にクラスのメンバーである関数であると言っている場所 交換の一種ではなく、実際には、そう 私のメソッドの内部ので、私は新しいメソッドを作成したいと思います。 それは、何も返さないようにするために起こっているので、void型になるだろう。 これは私の関数の戻り値の型です。 - 私は知らないので、今、私たちは、ここに括弧を持っています。 次は、私の関数の名前であることを行っている そして最後に、我々はCで持っていただけのようにセミコロンを持っている ここで何が新しいのは、この男はここにある。 このハイフンは実際には必要であり、これが何を言うことはつまり ここでは、このメソッドはクラスのインスタンスを呼び出す必要があります。 我々は、構造体を宣言した後、我々は、おそらく何かのように言った 構造ノードnと、その実際の作成 私が実際に作業を開始することができるように、または、それらの構造体のいずれかをインスタンス化 その中に何があるため、このダッシュは、我々がしなければならないことを意味 ちょうど私達がインスタンス化のようなクラスをインスタンス化し、その構造体 我々はそれにこのメソッドを呼び出すことができます前に。 私は私のメソッドに引数を追加して起動したい場合 それはさらにバナナを取得します。 ここに私のメソッド名です。 それから私は、コロンを持っているつもりだし、このコロンの後に、それはいくつかの引数をここに来ると言います。 このメソッドは引数を一つ取る。 その引数の型はintで、その引数の名前である または私はメソッドの内部で使用を開始するつもりだと変数iと呼ばれています。 繰り返しますが、この方法です。それは1つの引数を取ります。 あなたがより多くの引数を追加起動したい場合、それはより多くのバナナを取得 という点で、我々はここで言うこのコロンは、引数の私のリストを付属していました。 この最初の引数は整数である。 さて、この2番目の引数は面白いです。 私は関数の内部で使用するつもりだという変数 私が言うことができる私の関数のように内部にFと呼ばれ、 F + = 1または何か。 ここで、このことは、基本的にその引数またはパラメータのキーです。 我々は、キーと値のペアを持っていて、JSONまたは連想配列のようなものと同じように Objective-Cはそれが本当に明らかだだけので、大丈夫、と言うことを決定しました あなたはこれらのすべてのパラメータが何であるメソッドを呼び出したとき 私は実際にそれらすべてに名前を付けるつもりです。 メソッドを呼び出すときは、実際には、andFloat言うよ その後、あなたはそれをインチ渡すよ 興味深いことに、この1つは、名前が付けられますが、他のすべてのパラメータがありますされていません 我々は第三引数を持っていた場合ので、私はandFloatを言うことができる と別のフロートなど。 私はこれらのメソッドを呼び出すとき、それは、もちろんバナナのです ので、私はオブジェクトを持っている、と私は、fooというメソッドを定義した場合 と私はそれを呼びたいのではなく、fooの開/閉括弧を言って 私はブラケットを開くつもりです。 ここに私のメソッドの名前です。 私はブラケットを閉じてするつもりだ、とこれは私がそれを呼び出しているオブジェクトです。 覚えておいて、これらのすべてのメソッドは、クラス内に存在し クラスは、それらの内部に定義されたメソッドを持つことができるので。 ここで私は勝手に、いくつかのクラスのオブジェクトを作成しました これはことを行うための構文です。 オブジェクトを作成するための2つのステップがあります。 最初のステップは、私がスペースを割り当てたいと言うことです。 これはmalloc関数と等価です。我々はもはや、mallocを言う必要はありません。 我々は、mを落としてallocを作り、。mで。cを取り替えた。 我々のalloc何かの後に我々は、それを初期化する必要があります。 基本的には、オブジェクトを作成する際には、いくつかのロジックを持っているしたい場合があり 彼らが作成しているときに実行されることなので、いくつかのデフォルト値を渡すことができます またはそのような何かがないので、このinitメソッドは、実際にオブジェクトを作成するものです。 私たちは最初に、我々はC言語でやったように、スペースを割り当てる それから私達はまたは全体の多くを行うことなくてもよい、それを初期化します。 その後、我々はオブジェクトoにこの事を返そうとしている。 これは技術的にはポインタであるため星が、ここにあります しかし心配しないで、ポインタはもうObjective-Cの中で大したことではありません。 今、私たちは、NSObjectと呼ばれるこのクラスをインスタンス化した、 これはちょうどAppleが持っているランダムなクラスです。 我々はこれをインスタンス化してきたが、今私は、このクラスのインスタンスを持っている このオブジェクトのoので、私は定義されている場合ことを意味します これらの方法は、私はこのようにそれらを呼び出すことができます。 同様に、私は1つの引数を持つメソッドを呼び出したい場合は、 ので、これは一つの引数をとりバー法、、です カックス法、これは2つの引数を取りますと、ここにバズです。 これは、このオブジェクトoに1つの関数を呼び出すことです。 理にかなって? 構文は次の意味を持ちますが、あなたは一種のそれに慣れる。 さて、のは、Objective-Cに組み込まれているいくつかのことについてお話ししましょう その必ずしもCにビルドされていない C言語では、種類のもので、これらの愚かな文字配列として文字列に対処しなければならなかった そしてそれは本当に迷惑だ。 Objective-Cは、すべて私たちのために建てられたものがあり、それが組み込まれている NSStringクラスと呼ばれるこのクラスを使用しています。 私はNSStringを作成したい場合、我々はもっと難解な構文があります。 むしろ我々は@ "CS50"と言う "CS50"を言うより これは単なるObjective-Cで文字列を宣言するための構文です。 これは忘れて、そうしないことは非常に簡単です。 さて、かつて私はこれを持って、これは文字列ですが、気付く それだけで本当にオブジェクトです。 私は言った私は、クラスをインスタンス化した意味は、NSString、 他の誰かが私のために書いたNSStringの、と呼ばれる、 そして、彼らは、今それについて非常に素敵だったし、 私はそれに対してメソッドの呼び出しを開始することができます。 私は、このオブジェクトの上のメソッドの長さを呼び出す場合 それは私には文字列の長さを返すことになるだろう。 これはCでちょうどstrlenのようなものです これは4を返します。 同様に、私は気にしたいかもしれない別のメソッドは、このcharacterAtIndexです。 これは、この文字列sに言う方法です 私は、あなたがゼロ番目の文字を取得したい やので、これは、私には、文字cを返します そして、これらのメソッドの全体の束以上は、あなたが本当に簡単にGoogleができることがあるのです。 Appleのドキュメントは偉大であり、我々は少しのそのを見てみましょう。 それらは文字列です。 また、内蔵して可変サイズの配列を持っている 我々は配列を宣言したときにC言語で覚えている 我々はあなたが5つの要素、物語の終わりを持っていると言っていた。 我々は、JavaScriptとPHPに着いたとき、我々は始めることができた 要素を追加したり、要素を移動するようなことをやって。 我々は、Objective-Cで同じことを行うことができます。 通常のCの方法で配列を作成するのではなく、 我々は再びNSMutableArrayのと呼ばれるもう一つのクラスを持っています。 、NSArrayもあります そして、これは基本的にいくつかの配列をカプセル化しようとしている。 これは私が最初にしたいことは、私が割り当てたいと言う 新しいアレイに使用するスペースは、私はそれを割り当てた後、 私は、それを初期化する必要があります。 繰り返しになりますが、ちょうどこれらの2つのメソッドを呼び出す。 さて、これは、このオブジェクトの、その内側を意味 私はそこに座って、空の配列を持っています。 私は、この配列に何かを追加したい場合は、私はaddObjectメソッドを呼び出すことができます。 私は、配列にオブジェクトを追加したいと思い、私は、文字列CS50を追加したい。 私は逆に私が言うことができることを削除したい場合は私がしたい 配列またはオブジェクトの最初の場所にあるオブジェクトを削除します。 理にかなって? さて、あなたの種類のこの角括弧の事に慣れる。 ちなみに、Appleのライブラリの多くの中にあなたはこのNSを見るでしょう。 NSは実際にスティーブ·ジョブズ氏最初の企業の一つであった次のステップ、の略で、 彼は本当に多くのコードを書き始めたところ、それはだ Mac OS Xやその他のもののすべての基礎のようなものとして、 ので、このNSは、以前の会社の一つに、この素​​敵なレガシーの一種叫ぶれる 背面Appleが最初に出始めていたとき。 それはどこだ。 のは、より包括的なObjective-Cの例を見てみましょう。 ここで私はXcodeの内部です。 ここまで来るのに、私は最初、App StoreからXCodeをダウンロード 私は、ファイルにここに上がった後、それを開いて、 こっちに新しいし、プロジェクトに。 私は私が作りたいもののすべてのこれらのオプションを持っていることを実行した後、 それで我々は、後でこれらのオプションを見てみましょう しかしちょうどこの例では、我々が実際にはまだアプリを持ってするつもりはないので、 、私はここに来て、私はコマンドラインツールと述べ そしてこれは私がコマンドラインで実行できることアプリです 我々は、Cから実行してきたのと同様 、それは私がこのプロジェクトを作成した方法だし、今私はここにいるよ ので、このファイルの最初の一見してみましょう、これはかなり見覚えがあるはずです。 私はint名前を持っています。私の友人のargc、argvは私の他の仲間がある。 そして私たちは、これが私の最初のObjective-Cアプリケーションのエントリポイントであることがわかります。 ここでは、今のところはこれを無視することができます。 これは基本的にいくつかのメモリ管理のものであることをあなたは本当に意志 これまで心配しなければならない。 ここでは、この最初のブロックを見てみましょう。 この最初の行は、私が学生と言うなら*アリス= [[学生のalloc] initは]何をやっているのですか? ここでは、この最初の学生は、これはおそらくクラスです。 これは、Appleが書いたクラスではありませんが、それは私が書いたクラスです。 私が最初にしたいことは、私は新しい学生のためのスペースを割り当てたいです そして私はそれを初期化したいので、これは私に戻って与える この新しい学生オブジェクト、と私はアリスと呼ばれる変数でこれを保管しています。 そのクラスはどこから来たのか? さて、ここで上左側に、これらは私のプロジェクトの内部で異なるファイルのすべてです。 我々は、私がStudent.hとStudent.mを持ってここに見ることができます。 私は物事のすべてを宣言する場所。hファイルには、覚えておいてください それは、クラス内に存在します。 のは、その見てみましょう。 すべての権利、ここで私たちは、この@インタフェースを持って、これはここに来ていると言う 私のクラス内に存在があれば、すべての宣言。 それから私は、コロンを持っています。それから私はこのNSObjectのものを持っている。 このコロンは、我々は少し前の議論していましたその継承ビットを意味します。 これは、NSObjectを行うことができ、すべてを語る NSObjectは誰か他の人によって書かれたこのクラス、ここで 私はそれを行うことができるようにしたいこれはNSObjectを行うことができますすべてを提供します。 NSObjectのことを私は基本的に次のことを意味しますと言って、 別のクラスのすべての機能を継承しています。 それは本当に私が使用できるさまざまなメソッドやプロパティの全体の束を与えた。 ダウンここで私は2つのプロパティを作成しています。 これが構造体だったら私の学生を意味し、これらは2つのことであろう 私の構造体の内部にあるため、すべての学生には名前があります 、それが文字列であり、学生もグレードがあり これはintです。 最後に、ダウンここで私は私の学生のためのメソッドを作成するつもりです。 、私はinitWithName、私の方法と呼ばれ、それは1つの引数を取り その引数は文字列であり、私はそれが名前を呼んだ。 今、私たちは、実際にこのクラスを実装する方法を見てみましょう。 ここでは、今私は、私のmファイルの内部だ 実装のためのmは、私は推測する。 私は私の実装では、私の最後を持っており、ここで私が実際に定義している場所である 何initWithName。 私はinitWithName、私のパラメータの名前を持っているし、この 私は実際に学生が作成しているところであり、 ので、これはちょっと謎めいていますが、これは決まり文句のようなものです あなたのコンストラクタに入れたい。 ここでは、この初期化関数、initWithNameは、コンストラクタの一種です。 基本的には新しい学生オブジェクトを構築している そして多分それの内のいくつかのデータを送信する。 私が最初にしたいことは、私はこのスーパーの事にinitを呼び出したいです。 私はHファイルで、ここに戻って言ったときにそのことを覚えていてください そのすべてNSObjectは学生も持っています。 私はまた何をすべきかの学生ですを作成したときにそれが意味 私はからそのデータのすべてを継承していることにはNSObjectのことを確認してください。 また、適切に初期化されます。 私は何を言う必要があるが、このスーパーで実際に親クラスを参照するために起こっている 私はから継承しているので、私は初期化を確認したいこと 私はそれを使用しようとして開始する前に依存していることのすべて。 それが正しく初期化されている場合、これは単にmallocの場合と言っているようです その後、私はいくつかのプロパティの設定を開始できるnullが返されませんでした。 JavaScriptとPHPでは、このキーワードは、これを呼んでいた これはクラスの現在のインスタンスと呼ばれます。 Objective-Cでは、我々は、この自己を呼び出します。 私はself.nameを言うとき、それはつまり、オブジェクト 私が学生のalloc initを言ったときに私が作成した、 つまり、オブジェクトを私に背を向けるだろう。 つまり、私は、そのオブジェクトの名前を設定したい 私は渡されたものへ C言語で同じように、我々は、このドットでメンバにアクセスする そうself.nameは、学生·オブジェクトの名前を言う 今、あなたはちょうど渡さどんなことを行っている 私は実際に何かを得るようにし、そうついに、私はそれを返すことができます。 質問はありますか? さて、この自己=スーパーinitは、 あなたが完全に継承のものを理解していない場合、心配しないでください。 ただ知っているあなたは今まで自分のinitメソッドを作成する場合だけ それを行うと、あなたが行ってもいいでしょう。 うん。>> [学生]自己意味する場合はどういう意味ですか? これが意味するときに我々は、malloc、それがnullに等しかった場合、我々は常に何かをチェックし、 それがnullであった場合とし、我々は終了しました。 このメソッドはnullを返した場合は、次に我々は、おそらくワンセグ障害になるだろうので、これは同じものです 我々はそれを操作しようとし始めた場合。 それが私たちの学生のクラスです。 我々は2つ​​の方法のいずれかで私達の学生を初期化できることを意味します。 私が学生のalloc initを言うならば、私は私がちょうど書いた、そのメソッドを使用していないよ、 その代わりに私は単純に、alice.nameを言うことができる そして今、私は、そのプロパティ名を設定するつもりです。 同様に、私はそのinitWithNameメソッドを使用したい場合 私は単にallocを言って、その後ではなく、initは言ってすることができます 私が作成したばかりのそのメソッドを呼び出すつもりだ、と私はボブに渡すつもりです。 この時点では、このオブジェクトボブはボブと同じ名前を持っています。 さて、ここでダウンして私は、私たちが以前見たことがそのNSMutableArrayを使用しています。 私は新しい配列を初期化していspace.Thenを割り当てています。 私はそれに2つのものを追加するつもりです。 この配列は、今や学生のオブジェクトを保持します。 どこにも私は、これは学生の配列であると言わざるを得なかったことに注意してください。 私はそれが配列、期間だと述べている。 それから私は私がしたいこと、それの何でも内側に置くことができます。 ここで私は2つのオブジェクトを持っています。 最後に、私は、ここでこのTFを別のオブジェクトを持っています。 ここTF.hで上基本的には同じこと。 私はNSObjectから継承し、ところでよ、 あなたがクラスを作成するときに、これはすべてのあなたのために行われ、 インターフェースの決まり文句のこの種。 それは学生のプロパティを持っています。 私は、本当に全体の多くを行うことはありませんここにカップルのメソッドを持っています ので、私はこのTFオブジェクトを作成した後、つまり、 私はこのように上でこのメソッドグレードを呼び出すことができます。 我々はいくつかの詳細に移動を開始する前に、Objective-Cの構文上の任意の質問 面白いアプリ開発のもの? さて、実際にiPhoneアプリを作ってみましょう。 あなたのiPhoneアプリの内部で使用されるだろうとコアクラスは、ビューコントローラと呼ばれ とビューコントローラは、基本的に単一の画面を表します あなたのアプリの中にいるので、私は、例えば、音楽のアプリを利用している場合 つのビューコントローラは、私は私のiPhone上のすべての曲を表示するビューを表すことができます。 私はこの曲をクリックして、再生を開始するときに、別のビューコントローラは次のようになります。 または私はアーティストにドリルダウンしているとして。 それらの異なる画面の各々は、異なるビューコントローラのように表すことができ とビューコントローラは本当にこの画面がどのように動作するかと言うだけのクラスです。 ビューコントローラの内部の事は、我々は、プロパティを持っているつもりです ので、ボタンのようなものが私たちのビューコントローラのプロパティであることを行っている。 我々はまた、メソッドを持っているつもりです、そして、これらは基本的にイベントハンドラです。 この方法では、このボタンを押したときに言う 私は、何かをしたい、そして最後に、再び 我々は、現在のインスタンスにアクセスするには、この自己キーワードを使用することになるだろう。 iOSでインターフェイスを構築するためには、実際には、本当に簡単です。 彼らは、Interface Builderで呼ばれるこの素敵なドラッグアンドドロップインターフェイスを持っている Interface BuilderはにあなたのObjective-Cの上昇と2コアの概念、そのワイヤ IBOutletとIBActionはされています。 IBOutletは単に、あなたがボタンのプロパティを宣言した場合と言う そしてあなたは、あなたの実際のUIで何かにそれをフックしたい あなたはそれが出口だと言うつもりです。 同様に、イベントハンドラを表したいと思えば あなたはそれがアクションだと言うつもりです。 実際にこのグラフィカルな表現の配線を行うには あなたのコードは、それは本当に、本当に簡単です。 あなたはIBOutletを添付したい場合は、あなたがしなければならないすべては、あなたがクリックを制御で そして我々はこれは本当に速いの例を紹介します。 ビューコントローラがそれを言うところには、クリックを制御します。 あなたは、逆にインターフェースにドラッグするか、またはしようとしている あなたがイベントハンドラをフックしたい場合は、インタフェースからドラッグしようとしている 他の方向に。 のは本当に簡単なiOSの例を見てみましょう。 新しいプロジェクトを作成してみましょう。 私は、アプリケーションへのここまで来るつもりです と私は、シングルビューアプリケーション]をクリックするつもりです。 私は次のクリックするつもりです。私は自分のプロジェクト名を与えるでしょう。 私はこんにちは、それを呼ぶことにします。 興味深いことに、Appleは、製品を作成することを想定してい あなたはそれを販売することができ、彼らはお金を稼ぐことができるようにします。 ダウンここで私は、これはiPhoneアプリであると言うつもりです。 あなたがiPadアプリを作成したり、それらのアプリケーションのいずれかを作成したい場合 それはあなたもそれを行うことができます両方のデバイスをサポートします。 これらはあなたがあなたのチェックマークが見えるように何をしたいです。 あなたは、私たちが後で見るストーリーボードを使用したい とあなたは間違いなく、参照カウントを自動的に使用したい これはmallocとfreeと言うする必要がなくなり便利な機能です。 あなたはmallocとfree呼び出したい場合を除き、私はこのチェックしたままにしておきます。 私は、次をクリックします、そして最後に、これは私がそれを保存する場所を尋ねるために起こっている。 私が作成を打つだろうし、ここに私達は行く。 私は、新しいプロジェクトを作成しました。 ここで左の上で、私のプロジェクトの中にあるすべてのファイルであり、 と私は全体の束を持って、私も何もしなかったことに気づく。 IOSは素晴らしいです。 たとえば、ここにこのViewController.h、 これが私の最初のビューコントローラを表すために起こっている、 私のアプリの内の最初の画面がそう。 今、私たちは、これが言っていることを知っています。 我々は、私はこのクラスのViewControllerを呼んでいると言っている とViewControllerは、のUIViewControllerが行うことすべてを行う これは、再び、Appleが私たちのために便利な多くのものを行うことを書いたいくつかのクラスです 画面を表示したい。 私は実際に私のビューコントローラが何をするかの定義を開始することができますのはここですが、 そしてそれは私が本当にこのいずれかを必要としないことが判明した。 これは、Appleが無料で私を与える定型コードです。 、私はその最初の行を必要としたか、私はクラスを持っていない ので、我々はそれを取り除くと、これを取り除くことができます。 わかりましたので、これは私の空の画面です。 さて、このMainStoryboard.storyboardをクリックしてみましょう それが面白くなって始めるところ、これはです。 これは私のアプリの最初の画面を表します。 私はボタンを追加したい場合は、HTMLで私はbuttonタグを作成する必要がありました。 Androidには、buttonタグを作成する必要があります しかしiOSで私はちょうど右下にここに降りてくる場合 私はここで、この第三のものをクリックした場合、それは、オブジェクトの言うところ と私は、下にスクロールしたり、私はボタンの検索を開始することができます。 そして、私は実際にそこにこの権利をドラッグ·アンド·ドロップするので、もし、ボタンを見て 私はちょうど私のアプリにこの画面にボタンを追加しました。 私は、テキストを変更したい場合は、私は二重、それをクリックすることができます 何かのように誘導言う "私を押してください。" さて、私はこのアプリを実行した場合、我々はそれをコンパイルし、 ので、それを実行するために、私は左上の再生ボタンをクリックして、私のアプリがあります。 私は何もしませんでした、と私は甘い見てiPhoneアプリを持って。 私はそれを停止したい場合は、停止ボタンをクリックすることができます それはより多くの楽しみだから。 私は実際に私は、このボタンを押したときの動作に何かをしたいと言ってみましょう。 私は何をする必要があることを行うために私が作成する必要があります 新しいイベントハンドラまたはアクション。 それは私が私が呼ばれるようにしているいくつかのメソッドを作成する必要があることを意味 私はボタンを押したときに、それでは、新しいメソッドを作ってみましょう。 私はViewController.hの内側だ。 私は、メソッドが存在することを表明する必要があります。 私は、ビューコントローラでこれを呼び出すことにするつもりですので、私は最初のハイフンが必要です。 私はこれに型を与える必要があります。 このタイプのは、我々が以前に見たことIBActionの事になるだろう。 これは、イベントハンドラなので、IBActionを返すために起こっている これがあることを言うためにXCodeにヒントです これは私が何かを配線したいものです。 私はそれをbuttonPressed、セミコロンのような名前を付けることができます。 さて、私のクラスの内に新しいメソッドを宣言した。 私は、このメソッドが存在している必要がありますと言ってきました。 さて、ViewController.mに来てみましょう そして、このメソッドは何ができるかと言うてみましょう。 私が入力を開始する場合は、例えば、(void)をbuttonPressed 予告XCodeのは本当にいいですし、私のために自動的に補完します。 それは本当に素晴らしいです。 mファイルの内部は私もvoidを言うことができるここで注意してください、 そのIBActionは、実際にタイプではないので、これはです。 それは、実際には、無効とするためにどこかに定義されているハッシュタグ そして、再び、これはちょうど言うXCodeにヒントです 私はこれがイベントハンドラになりたい、と理由だけで第二で我々が表示されます。 このボタンが押されたときに私は迷惑な何かをするつもりだ ポップアップを表示するように。 私はUIAlertViewと呼ばれるこのクラスの新しいインスタンスを作成することができることを行うには、 これはAppleが迷惑なポップアップを表示するように起こっていることを書いたクラスです。 我々は、このポップアップアラートを呼ぶことにします、そして、私は2つのステップを持って、このオブジェクトを作成するには、覚えています。 私が最初にすべきことは、領域は割り当てられています。 私はUIAlertViewをしたい。 私はスペースを割り振りたい。それが私の第一の方法です。 私の次の方法は、私がそれを初期化したいです そして私はinitWithTitle呼ばれるこの大きな、長いメソッドを持っています。 それは基本的にこのポップアップが何を言うか制御するために起こっている。 私のポップアップのタイトルはhelloすることができます。 このポップアップのメッセージができる "これはiOSのである。" デリゲートの事は、私はそれが何であるかを知らない。 レッツは、それの何も言わない。 今すぐ表示されるように起こっているボタンは、 "それは確かです"のような何かを言うことができる と私は本当に他のボタンはしたくないので、それを削除して、ブラケットを閉じてみましょう。 さて、私は余分なものを作成しました。そうしよう。 これは、私が新しいポップアップを作成することができる方法です。 私は実際にポップアップを表示したい場合、私はshowメソッドを呼び出す必要があります。 私は警告してショーを言うことができますこれを行うには、 そして再び、オートコンプリートは超よかったよ。 私はちょうどsで入力した場合それは、何だったか忘れてしまった場合は、 私は、それが何であったかを把握するにはここをスクロールすることができます そして、それはうまくフィルタリングします。 今私はこの新しいポップアップを作成しました。 我々は、後でデリゲートが何を意味するかに戻ってくる そして今、私はこの方法が発射されるようにすると言いたい 私はボタンを押したときに、私は私のストーリーボードに戻ってくるつもりです、 そして私は今、このIBActionを接続したい。 あなたが最初にしたいことは、ボタンをクリックするだけです。 私は、このボタンを押したときに何が起こるために何かをしたい。 私は、コントロールを押したままにするつもりはない。 私はクリックして、ボタンからドラッグするつもりです ここ以上の場所にそれはView Controllerを言う。 我々は、それがうまく点灯していることがわかります。 私はマウスを使って行かせている場合、私はいくつかのオプションを持っているここで私は今ここにの上でこのポップアップを持っています。 これらの一つは、私が登録できるイベントです。 これらは、私がIBActionsとしての私のhファイルで宣言されているすべてのメソッドです。 これは、Xcodeはこの小さなリストに表示されるべきかを知る方法です ので、それはただのヒントだ。 私は押されたボタンをクリックすると、私は今、イベントハンドラを登録した。 JavaScriptでは、私たちは、私がイベントハンドラを登録したいくつかのコードを持って言っていた。 Objective-Cでそれは本当に簡単でした。 私は再びこれを実行した場合 今私がボタンを押したときに私のイベントハンドラが起動するように起こっている、 と私は、このポップアップを取得するつもりです。 そこにスーパー、超簡単。 あなたは今までに登録されるために起こるすべてのイベントを見たい場合 コンポーネント上で私は、このボタンをクリックした場合 と私は右側にここに来て まず、上見ることができ、ここで私は、ボタンの種類のようなものを行うことができます あなたはそれらの私の、または連絡先の追加]ボタンのいずれかをお望みであれば または何でも。 私は、このボタン上にあるすべてのイベントを見たい場合 私はこっちの右側にすべての道を歩んでいる場合 我々は、私は、これらのさまざまなイベントのすべてを持っているイベントで、ここで見ることができます。 私は、ボタンから指を離したとき、私はときに私はダブルタップまたはものは何でも、、、ボタンを押すことができます そして私はちょうど登録したものは、内部にタッチアップと呼ばれるこのイベントです そして、これはできるだけ早く私の指がボタンをオフに来るようにと言っている そのイベントは発生しようとしている、そしてそれはちょうど何が起こったかを正確です。 これは、デフォルトのボタンが押されたイベントの一種である。 これまでに何か質問はありますか? さて、それは我々が我々のコードで物事をつなぎ合わせるために始めることができる方法です 私たちのインターフェイスの内側の事に。 我々がしなければならなかった最初の事は、コードを見つけることだった覚えている それから私達は、コードのインターフェイスを有線 と我々の最初のアプリがあります。 さて、それは本当にクールだった、そして我々は、このボタンを作成しました。 我々は、プロパティの束を作成する必要がしたくない場合はどうすればよい これらのボタンを表す? たとえば、Tic Tac Toeので、私は9のボタンを持って、 そしてそれは9回をドラッグ·アンド·ドロップしなければならないのスーパー、スーパー迷惑になるだろう または私は81の代わりに、9でTic Tac Toeのをしなければならなかった場合 そして、私は81回ドラッグ·アンド·ドロップしなければならなかった、そしてそれはラメだ。 我々が代わりに出来ることは、はるかにHTMLのようなものです 私たちは、IDと名前のようなものを持っていたし、我々は物事を検索することができたとき そのIDで、タグと呼ばれるiOSで同じような概念があります。 タグは、単にコンポーネントの一意の数値識別子です。 私はこれが0のタグを持っていると言うならば、例えば、 私は、ボタンを作成し、それに0のタグを付け、私達はちょうど第二にそれを行う方法を紹介しましょう​​場合、 私はそのボタンを取得したい場合、私は単に私が呼びたいと言うことができます ここでオブジェクトのメソッドをviewWithTag、 例えば、現在の画面を表しself.view、。 私はそのviewWithTagメソッドを呼び出した場合、私はタグ0のボタンを引き戻すつもりです。 のは、Tic Tac Toeのを構築することにより、これを見てみましょう。 まず、これは私の絵コンテです。 私は、これらの10のUIボタンを作成しました。 それらはすべて同じサイズだ注意してください。 私はこれらのいずれかをクリックして、私はこの右側にこっちに戻ってくる場合 あなたは、私はここのフォントを調整するので、私は少し大きいフォントを作ってくださいよ 私はまた何をしたかは、私は、このタグを設定していた。 私はこれが1のタグを持っていると述べ、それは左上です。 今、私はここでこの第1のように、別のボタンをクリックした場合、 今、あなたは私のタグが2であることがわかります。 これらの各ボタンは、単にユニークなタグを持って、 ので、これは私が対話を開始するつもりですどのよ​​うに後である 私のアプリでは。 これにより、1つのビューコントローラのすべての内部です しかし、ここで我々が​​持っているものです。 我々はここで3つのプロパティを持っています。 最初のものと最後のものは私のボードの状態を表すとしている。 基本的に、この最初のものは、XSとOsがどこにあるかを表す配列です。 このもう一つは、ここにそのターンそれは教えてくれる。 あなたは、私はまたここにこれらのものを持っていることに気づくでしょう。 前に我々は、プロパティを宣言したときに我々は彼らの名前と型を与えた。 また、ここで、それらにいくつかの追加情報を与えることができます。 これは、最初のアトミック言って、これが何を言う 基本的にはただ一つのことは、今までに、随時、この変数にアクセスしようとされています。 あなたは、マルチスレッド化され、より複雑なアプリケーションを行うことができます などバックスクラッチで我々は、異なるスレッドを持っていた と異なるスプライトを同時に違うことをやっている可能性があります。 それはそれは私たちが見ることになりますことは何に含まれていない場合、ない場合 我々はアトミックと言う場合、それは実際に物事が少し速くするために起こっている。 我々はまた、アサイン強い、または弱いと呼ばれるこの事を持っている。 この割り当ては、ちょうどこれは標準的なタイプであることを述べています。 これは単にboolですので、これは、オブジェクトやポインタではありません そうboolはObjective-Cのに組み込まれています。 これはここにポインタを持つファンシー何もしようとしないと言います。 これは、定期的に古いスケーラーです。 強者と弱者、これは実際に弱いと言う 私は、これはビューコントローラの中で何かを指しているしたいと思います。 私は実際に自分自身を割り当てるか、またはこれをinitにするつもりはない。 Interface Builderは、私は、アプリを実行すると、すべてが初期化を処理しようとしている。 私は弱いと言うなら、それは他の誰かがこれを作​​成しようとしていると言います。 私は強いと言えば、これは私が1になるんだと言っている このボードオブジェクトを作成していること、 ので、ここで私は、ここでいくつかのより多くのメソッドを持っています 例えば、新しいゲームのボタンが押されたときのアクション、 他のいずれかのボタンが押されたときのアクション、 とエトセトラ。 我々は、チックタックつま先のロジックのあまりに取得することはありません それは非常にエキサイティングだが、みましょうを見てみるものの、 我々はiOSの内部にできることの一部。 この新しいゲーム方式は、解雇されようとしている たびに私は新しいゲームのボタンを押してください。 まで、私は単に私のストーリーボードに来ているフックに。 私は新しいゲームをクリックしました。 私は右にここに来た場合、私はそれを見ることができます newGame方法に配線されて内部に触れないでください。 これはクビにしようとしている理由です。 newGameメソッドは、いくつかのセットアップを行うとしている。 それは、私はあなたがボードの状態をクリアしたいと言うだろう。 これは、変更可能な配列の素敵な方法です。 これは、今ではXの番だと言うことが起こっている そして今、私はこのviewWithTag事を活用するつもりです。 私は、私のボタンは1月9日タグを持っていることを知って そしてそれは私が勝手に選んだものです。 私は空のように各ボタンのテキストを設定したい場合 私はちょうど新しいゲームを始めたと私は何をしたくないので、 私はこれを行うことができます上に残すことへのXSまたはOs。 私はタグ付きのビュー、1、2、3、4エトセトラをしたいと言うことができます。 これは、別のボタンを毎回引っ張ってくる。 ここで私はUIButtonにキャストするつもりです。 私たちは、山車とその逆にintを唱えられるのと同じように これは私がUIButtonにこれをキャストしたいと言っています。 つまり、これの型はUIButtonの*となります ポインタのためですが、心配しないで、彼らはもう怖くないよ。 かつて私は、私はそれにメソッドを呼び出すつもりだ、このボタンを持っています。 このメソッドは、上余白forStateと呼ばれ、ので、これは言っている 私は、空の文字列になるようにボタンのテキストを設定したい そして私はそれが押されていない空の文字列になりたい。 私はこの方法を使用するならば、私はボタンのテキストを変更することができます 誰かがそれに当たるが、我々はボタンはただそこに座っているときに言いたいとすぐに 私はテキストが空白になりたい。 最後に、我々は、私のボードを初期化しようとしている と私は、すべてが0に現在表示されていると言うつもりです このようにボードメンバーは不変、可変配列です これは私がaddObjectメソッド、それのちょうど0内部を呼び出すことができますを意味します。 それは私が新しいゲームを作成したときに起こることです。 のは、別の1つを見てみましょう。 ここでは、このメソッドは、押されたことになるだろうIBActionです これらの四角のたびに1が押されています。 今、私たちは、ここでいくつかのTic Tac Toeのロジックを持っている。 我々は、そのターンそれが把握 そして、我々は、XまたはOを設定し、それに基づい しかし、我々は、我々はこの同じイベントハンドラを再利用していることに気付く これらのボタンのひとつひとつの1のために。 私は左上のボタンのための方法を持っていないことを意味し、 私はそれを行うことができる持っているが、右下のボタンに別の方法。 それは本当に良いデザインではないでしょう。 私がここでやっていることは私が実際に決定するつもりである 押されたボタンのタグは何ですか。 このplayメソッドは、1つの引数を取ることに注意してください。 それは、送付者と呼ばれている、と何送信者が送信者はに起こっているされている 際に行動をとったかを正確に表しています。 私はボタンを押した場合、その送信者はそのUIButtonになるだろう 私が実際に押されているので、ことはつまり、そのUIButton 私はタグを作成したので、タグを持っています。 私はタグを取りたいのであれば、私は単純に言うことができる 私は、送信者のタグが欲しい そして再び、私はちょうどUIButtonにそれをキャストしました。 私は、送信者がUIButtonになることを知っているに起こる。 それは、常にUIButtonである必要はありません。 私は、例えば、同じイベントハンドラを登録することができます  ボタン、スライダの1対1のために。 このケースでは、私は、彼らはすべてのボタンにしている知っているので、私は言うつもりです 私は、これはボタンになりたいし、私は、タグを取得することができます とタグから私は今、私はボードの内側の居場所を知っています。 それから私は、単純に、順番を反転させることができ、XまたはOのいずれかを設定することができます エトセトラ、勝った人を確認してください。 これまでのところで何か質問はありますか? さて、我々はオンラインで我々はあまりにも多く入るためにしたくない投稿されたすべてのコード Tic Tac Toeのロジックが、今あなたが本当にそれで見ることができます 我々がやっているすべては、我々はこの配列をループしている ので、ここではforループのカップルを持って、私たちはただ見て比較している 我々は、すべての行、列、またはそのような何かで一致でマッチするものはありません。 私はこれらのいずれかのボタンをタップすると、実際には、このアプリを実行するには 私はちょうど設定意味ように、そのプレイ方法は、解雇された ので、今、このボタンがOされますので、その上で、Xとするためのボタン、 そしてそうそれは我々がこの単一のページのアプリと対話し始めている方法は以下の通りです。 我々は、コードを投稿しますので、それを熟読すること自由に感じ、 しかし、今ちょうど1ページ以上のものであるいくつかのアプリの話をしてみましょう。 Tic Tac Toeのと同じくらいエキサイティングにはiOSの内部に、アプリがたくさんあった 複数の画面で物事ダウンこれらのドリルの一種である。 我々が話をしておく必要があるでしょう最初のコンセプトは、プロトコルである およびプロトコルは、単にメソッドのセットです あなたが定義することをお約束できること。 私は2つのメソッドを使ってこの新しいプロトコルは、この最初のものを作成する場合、 戻り値の型がvoidの場合、私はそれをfooという。 このメソッドは引数を取りません。私は別の方法を持っています。 それはintを返します。私はバーにそれを呼び、それは1つの引数を取ります。 すべてこのプロトコルは、ここSomeProtocolを呼ばれるているということです これは誰かが実装することができるもののセットです。 私は内部のこのプロトコルのは、fooが何を言っていない。 その代わりに、私はちょうどあなたがしたい場合は、fooを定義することができます言っている。 私は、ビューコントローラを作成するか、クラスを作成している場合 私は内部のそのクラスの約束実装することができます そう言う場合などに、これらのメソッドの一部、 これは今私があなたに約束を作ってるんだと言い、その内側 このView Controllerクラスの私は、fooとbarの両方の定義を持つことになります。 なぜそれが役立ちましたか? iOSの内部の部品の多くは、この機能を利用する デザインパターンは、委任と呼ばれ、代表団は何を言う つまり、例えば、私は、テキストボックスを持っている場合 と私のテキストボックスの内部に登録することができるいくつかのイベントがあります むしろ私は何ができるか、別のイベントを作成するよりも、私が言うことができるである このテキストボックスのデリゲートは、いくつかのオブジェクトになります。 私はこのことを意味します今デリゲートであると言う場合 いくつかのイベントは、テキストボックスに解雇されたものであれば のではなく、またはそのような何かを登録すること それはちょうどデリゲートでメソッドを呼び出すために起こっている。 例えば、私のテキストボックスの内部は私が押したときのための方法を持っている それは、右下のボタンをなさ とそうではなく、私が言うことができる何かのイベントハンドラを登録している テキストボックスには、ここで私はあなたが上のメソッドをコールする必要があるオブジェクトです。 毎回、誰かを押す[Done]ボタンを、 そしてそれはそのオブジェクトがいくつかのプロトコルを実装しなければならないことを意味 それは私が、そのdoneボタンアクションを定義することを約束すると言う 、それは、そのメソッドが定義されていない場合ので、あなたはDoneを押し それは混乱を招くことになるだろう。 のは、例を見てみましょう。 ここで私は単に、1つのテキストボックスを持っている とこの右側のこっちは、このテキストボックスのプロパティのいずれかを使用すると、デリゲートです。 これは、クラスのプロパティです。 私がここでやったことは、私がクリックしたコントロールであり、私はここの上でこのスポットからドラッグ ビューコントローラへの、それは、このテキストボックスのデリゲート今言う ビューコントローラであることを行っている。 いくつかのアクションが起こるのではなく、登録時にことを意味します 私は、あなたがデリゲートにそれらを送信する別のイベントハンドラ。 今度は、私のビューコントローラを見てみましょう。 hファイルの内部で、私は約束をしました。 私は、このプロトコルの内のいくつかのメソッドを実装することを約束しました 、UITextFieldDelegateと呼ばれ、再び これはちょうど私が実装することを選択することができますいくつかのもののいくつかのリストです。 私はmファイルでここに来るなら、私はそのような方法を実施しています。 私はそれtextFieldShouldReturnと呼んでいる そのことによって、そのプロトコルの内部で呼ばれていたものだからです。 そして今、私はそのテキストフ​​ィールドのdoneボタンの内側を押すと、必ず これは呼ばれるために何が起こっているのですので、私は、イベントハンドラを登録しませんでした。 私は、デリゲートを接続し、このイベントが起動されると必ず これは私が私のストーリーボードにこっちに来て、実行しそうだとすれば、呼び出されるメソッドであることを それはロードしていながら、私たちは、これが何をするか確認することができます。 私の画面で私は2つのものを持っている。 私はこのテキストフ​​ィールドを持っている、と私はこのラベルを持っています。 私は単に私がこのラベルのテキストをしたいと言っている ユーザーがテキストフ​​ィールドの内側に入力したものは何でもと等しくなります。 ここでは、この次の行は、単に私が呼んでいるという方法です 私は、あなたがキーボードを非表示にしたいというテキストフ​​ィールドに。 これはちょうどAppleが選んだ任意の方法です。 私が手を打つ前に、再び、私はすべてのものを配線しなければならなかったので、私が最初にここに来た。 ビューコントローラから私は、テキストボックスにドラッグします。 私が行かせて、私はこのテキストフ​​ィールドのプロパティを作ることができることがわかります こっちのビューコントローラで私は、プロパティを定義したので、 それは、テキストフ​​ィールドのIBOutletです。 これは、私は、このプロパティを結びつけることができると言います 私のUIのテキストフ​​ィールドへ。 今私はこれをクリックしたときに私が入力を開始できます。 私が行ってボタンをクリックすると今これが発射しようとしている 私は今に応答できるイベント。 いいえイベントハンドラはありません。 それは私がちょうどそのdoneボタンに反応してみましょう。 理にかなって? これは、あなたがそれを史上自分自身を見つけることができない場合があり、デザインパターンではありません 独自のプロトコルを作成しますが、ただ知っているいくつかの 異なるiOSのコンポーネントは、さまざまな方法でイベントを登録します。 ボタンには、例えば、それらIBActionsを使用しています。 テキストフ​​ィールドは、他の一方で、デリゲートを使用しようとしている。 我々は見ることができますし、ドキュメントのそれまでの内部のすべてを見ることができます。 ところで、あなたのためのIOSに組み込まれたUIのもののトンが実際にあり、 私は右下で行わ言う作ったので、例えば、道 私はこのテキストフ​​ィールドを選択されています。 私はここにやって来ました。 私は、キーを返すために少し下にスクロール そして私は実際に私がいることを言いたい場合など、この事物の全体の束を作ることができます 緊急時には、完全にランダムである、代わりに私がそれを行うことができる呼び出す 内蔵の緊急呼び出しボタンがある理由と、私にはわからない、 しかしそこに、それは本当に小さな文字で緊急コールを言う。 そこに行く。 間違いなくiOSのこれらのさまざまなオプションのすべてを探る。 デリゲートの何か質問はありますか? 繰り返しになりますが、あなたが知っておくべきことだけ面白いデザインパターン。 さて、次のテーブルビューを見てみましょう。 テーブルビューは基本的にすべてのiOSの場所の上にある項目のそのリストです。 あなたはすべての連絡先をめくっているとき、あなたは見ている 設定ページ、物事のリストのようなものがテーブルビューと呼ばれます。 iOSのテーブルビューを実装すると、非常に単純です。 その代わりのUIViewControllerから派生するクラスを作る 我々は単に言うのではなくする必要がある前に私たちはやったような のUIViewControllerは、私がやりたいんすべてのもの、 私は、私がやりたいんUITableViewControllerをすべて言う そう、それは単に完全に私たちのために行われているいくつかの追加のものが追加されます。 私たちは基本的にテーブルの内側の空白を埋めるのは非常に少しを行う必要があります。 私はいくつかの質問に答える必要がありますテーブルを表示するために。 私が答える必要がある最初の質問は、テーブルにどのように多くのセクションですか? あなたの連絡先アプリをめくっているときには、それは一種のだということに気づくでしょう として主催する、あなたはBを持っていて、その小さなサブヘッダーがあります。 それらの各々は、セクションと呼ばれています。 あなたは可能性があり、または、これらを必要としないことがあります 最初にしなければならないのは、メソッドを実装することです numberOfSectionsInTableView:のTableViewと呼ばれる。 それは単に、あなたが持っているどのように多くのセクションを返す ですから、これは一つの大きなテーブルビューを使用している場合1を返すと言うことができます。 iOSは知っている必要があります次の質問は、あなたはどのように多くの行を持っているんですか? たとえば、テーブルビューをめくっています。 あなたは、あなたが見ている曲の数が固定または連絡先の固定番号を持っています。 、その多くはありません、もちろん、あなたが私にしている場合 ので、それはiOSが表示する方法を多くのセルを知ってみましょう。 繰り返しますが、これは復帰3のような何かを言うことができます。 私のテーブルビューには、3つの行があります。 最後に、iOSは、各セルがどのように見えるかを知っている必要があります だから何それが実際に何をするつもりなのは、ダウンしてここにこのメソッドを呼び出すだけです。 これのTableView:cellForRowAtIndexPath。 それはあなたのテーブルのすべての単一のセル内部でこのメソッドを呼び出すことになるだろう。 それはどのようにそれを呼び出すために何回知っていますか? さて、あなたはセクション内の行数の中にそれを告げた。 我々は、我々の細胞のそれぞれにこの関数を呼び出すつもりだ そしてあなたが実際のようなものを行うことができるこの内部がある テキストを設定するか、右側にその小さな青いボタンが何かを知ることができます。 これらの細胞を得るためのパターンは、この方式を使用するつもりだ dequeueReusableCellWithIdentifierと呼ばれる。 Objective-Cは、それらのメソッド名のとんでもない長さのために実際には非常によく知られている そしてこれは本当にポイントの例での素敵なケースです。 これは、何このメソッドが何ですちょうど私があなたが私の細胞を提供したいと言います。 ただiOSの事。 あなたのiPodに10万曲のようなものを持っている場合 何iOSがやりたくないことは、100,000細胞を割り当てている あなたのリストの上部にあるなら、あなたは、実際にはメモリーを割り当てる必要がないため、 99000行下のセルのために? いいえ、あなたがスクロールしているとして、あなたが一緒に行くように割り振ることができるための一種。 これはあなたのために行われます。 あなたはすべてのその愚かな性能のものを心配する必要はありません。 あなたがなんと言おうとあなたは、このメソッドを呼び出しているdequeueReusableCellWithIdentifier そして、これはあなたがする必要がある場合、私はあなたのための新しいセルを作成するつもりです、大丈夫、と言います。 しかし、あなたは、表の一番下にしている場合、あなたはすでにいくつかのセルを割り当てた あなたが本当にいつでもすぐに必要とするつもりはないことは、表の一番上に 私はあなたの代わりに新しいものを割り当てるバックそれらのいずれかを与えるつもりだ ので、これは素敵なパフォーマンス上の問題である。 あなたは、セルを自分で割り当てる必要はありません。 それはセルををお返しになるだろう。 それはあなたにセルオブジェクトを返すようになるだろう。 一度あなたがそれにものを行うことができますセルオブジェクトを持っています。 あなたは、テキストラベルと呼ばれるこのプロパティでセルのテキストを設定することができます。 あなたは右またはいくつかの他のランダムなもので、その矢印を追加することができます accessoryTypeと呼ばれるこの他のプロパティを持つ、などなど。 のは、実際に今、テーブルビューを実装を見てみましょう。 私はこのプロジェクトを作成したとき むしろ単一のビュー·アプリケーションを言うよりも、私は実際にここにやって来ました マスター·ディテール·アプリケーションとなり、この結果、基本的に、これはメールアプリに対応 左側のテーブルビュー、右側の内容で計算された上で。 iPodやiPhone上で、これは単一のテーブルビューにも対応する予定です。 私はスターターコードを得たところです。 第一絵コンテを見てみましょう。 このすべてが基本的に作成され、私のために行われました。 このナビゲーション·バーには、例えば細胞がどのように見えることができるものを見せてくれた と私は、二重、このボタンをクリックし、タイトルを変更することができます。 その他のUIの懸念が、私はそこを処理することができます。 ヘッダーファイルには、本当に単純に見えます。 むしろ我々は今、これは言っている、これはのUIViewControllerであるというより TableViewControllerので、我々は、我々はすべてのそれらの表のメソッドを呼び出したいことを知っています。 次に、私が表現するために起こっているプロパティを作成する 私のテーブルの内側の事。 このテーブルには、任意に表示しようとしている フルーツのリスト、およびので、私はいくつかの配列を作成する必要があります これで私はフルーツを挿入することができます。 私の実装ファイルの内部に私が最初にしたいこと 私は、この配列を初期化することを確認したいです。 私は、アロケーションは、init言い私の果実の配列を作成し、 と私は、そこに他の3よりもはるかに多くの物議を醸しているそのうちのいずれかを4つの事を追加している。 そして今、私は大きさ4の配列を持っている。 我々はCS50でそれを振っている。 私は今、大きさ4の配列を持っている。 今私は、実際にこれらの質問への回答を開始する予定、としている 私はこのアプリを作成したときにこれのすべては、すでに私のために行われました。 私は、テーブルビューのセクションの数を入力する必要はありませんでした。 それはそこに既にあった、と私は空白を埋めるよ。 私はどのように多くのセクションを持っていますか? 一つ。すべてが完了しました。 私はどのように多くの行を持っていますか? まあ、私はすべての果実に1つの行を持っているので、このカウント それはどのくらいの大きさですと言い、任意の配列のプロパティですか? それは私が持っているどのように多くの行です。 最後に、私は、各セルがどのように見えるか言う必要がある? 私はdequeueReusableCellWithIdentifierを言うつもりです。 繰り返しますが、これは既に私のために書かれました。 私はこれを自分でする必要はありませんでした、と私は戻って取得したい この場所でこのセル。 我々は一つ一つのセルにこの同じメソッドを呼び出していることを覚えておいて、 ここでは、この引数は、このindexPathの引数、 私が入っているん行言う 私はここindexPath.rowダウンと言うなら これが0になり、それが1になり、それは2になりますが、これは私が知っているそうです 私は、現在表示しているものの細胞。 私はこのtextLabelプロパティを使用してセルのテキストを設定したい 私のフルーツの配列中に入ると取得する それぞれの行に対応するオブジェクト。 これが文字列であれば、私は今、設定してい 文字列へのテキストプロパティ。 私はもう一つのことを行うことができます。 私はまた、細胞のそれぞれにイベントハンドラを登録することができます ので、私はこれらの細胞のそれぞれをタップしたとき このdidSelectRowAtIndexPath、これは私のために呼ばれようとしている、 ので、単にこれを定義することによって、私は今、何が起こるかを扱うことができます セルをタップし、再び時、我々はセルがタップされた渡している ので、我々は我々の細胞のすべてのために、これと同じイベントハンドラを再利用することができます。 繰り返しますが、これはiOSが私のためにやっているものです。 別の迷惑なポップアップを表示してみましょう それは単にあなたがその何かを選んだと言う 行オブジェクトであることを行っている。 私はこれを実行すると、私はこの素敵なテーブルビューを持っているつもりです これらのフルーツのそれぞれに1つの行を持つ、と私は1つをタップすると それは何が起こったのか私に語った。 理にかなって? のは、アプリのもう少し複雑作ろう あなたはトマトを選んクリックするのと同じくらいです。 絵コンテの良い部分 それだけで私たちは個別に画面を設計するのに役立つことはないだろうし、 それはまた、私たちは私たちの全体のアプリを結びつける手助けになるだろう、 私たちは建物になります最後のアプリは、この素晴らしいスポーツニュースリーダーです ので、それは複数の画面を持っているために起こっているので、私は実際に表すことができます。 ストーリーボードでこれらの複数の各画面、 と私はズームアウトして高レベルから私のアプリを見ることができます。 私の絵コンテの新しい要素を内部に作成するために それは、Interface Builderの内側本当に簡単です。 私はこれに別の画面を追加したい場合は、例えば、 私は最初、Appleがそんなに大好きピンチズームでズームアウトできます 上下ここで私はボタンを検索する前に と私は、ボタンをドラッグ&ドロップ 私は新しい画面を作成する場合は、私は実際にちょうどドラッグアンドドロップできます 全体のビューコントローラは、私がこれを拾うので、もし、ここにそれを上に引っ張る ねえ、そこに別の画面だし、だから今この同じストーリーボードファイルを使用して 私は私のアプリの内部ですべての画面を持つことができる、と私はズームアウトすることができます そして、彼らがどのように相互作用するかを参照してください。 これらは、まだ相互作用しません。 これらの2つのスクリーンが相互作用する方法は、あなたが関係を定義することです。 基本的には、このボタンを押すと、この画面を言うことができます 私はあなたがこの新しい画面にオーバースライドする。 の間にこのような関係があることを意味し  最初の画面と次の画面。 基本的には、そのボタンから2番目の画面に矢印があるでしょう あなたは、私が行きたいところだ、このボタンを押したときにことが書かれています。 我々はそれらのアウトレットを定義するためにクリックしてドラッグしているコントロールだけが好き 我々はこれらのseguesを定義するために同じことをやろうとしている。 我々はそのための例を参照してください、我々は実際に移行する前によ ある画面から別の画面にiOSは、このメソッドを呼び出すには十分素敵です prepareForSegueと呼ばれ、我々が開始することができる場所です 別のアプリからデータを送信する。 我々はそれを見てついでに例では、基本的に私達を許可する リーグや部門が野球チームをフィルタリングします。 私はリーグを選択すると、例えば、私は移行したい 私は部門のすべてを表示することができます私の次の画面へ そのリーグで、またはすべて異なるチーム。 私はあなたが表示されるはずですどのチームがその画面に送信する必要があります。 私はここでこの方法の利点を取るつもりだこれを行うに。 最後に、iOS上だけでランダムな点。 あなたはデータを格納する場合は、コア·データと呼ばれるこの事は、あります これは実際に動作するように複雑のようなものです。 また、データを格納するためにSQLを使用することができます これは、再び、、で動作するように、より複雑な側面にいいが、種のある しかしiOSはまた、プロパティリストと呼ばれるこれらの本当にクールなものをサポートしています とプロパティリストは、単にキーと値のペアを表すファイルです。 あなたは、キーのリストを定義し、このキーが配列であることを行っていると言う。 このキーは文字列であることを行って、基本的にあなたが何かできることさ JSONでは、プロパティリストの中行うことができます ので、これは本当にうまく、私たちはいくつかのデータを扱うことができます。 たとえば、私は、私が作成したこのTeams.plistを持っています。 私は新しいplistファイルを作成し、私はドリルダウンすることができます。 これは辞書ですが、これは、これらは文字列ですが、辞書です ので、これはJSONドキュメントの素敵なグラフィカルに表現したものです またはキーと値のペアのセットだけ、 ので、これは私が私のアプリの内部で作業するようになるとデータです。 最初にここに来てみましょう。我々は今、より多くのファイルを持っている。 しかし、最初にストーリーボードにここに来てみましょう。 ストーリーボードヒア場合、私はズームすることができますアウト 我々は今、これが私のアプリの流れであることがわかります。 私が最初にこの画面に開始するつもりだ。 私は、この画面にドリルダウンするつもりだ と私は、この画面にドリルダウンするつもりだ、と我々はここで見ることができます私はこの種の場合 我々はこれらの矢印は、ここからここへ行くた周りに、これらのいずれかを移動 私は少しでズームインした場合、私は、その矢印を定義する方法があった と私は、このビューコントローラに来た場合、 そしてここでは、セルだし、セルをタップしたときに私はそれを言いたい 私はあなたが別の画面に上にスライドさせたいと思います。 私は単に、コントロールを押したままにすることができ 少し上をスクロールし、コントロールを押しながら、このセルを上にドラッグして放す。 そして、ここの上に私たちは、あなたが使用したいトランジション何と言う? あなたは、プッシュと呼ばれる、そのスライドのものを使用したいのですか? あなたは下から上にスライドしてもよろしいですか? それはモーダルと呼ばれています。 そして、かつて私は、これらのいずれかをクリックし、それは私のためにこの矢印を描画するために起こっている、 そしてそれは私が実際に私がグラフィカルに、このボタンを押したときに何が起こるかに処理したことを意味します。 私は実際には1つの画面から次のいずれかにスライドさせて任意のコードを書いていない。 私は、Interface Builderの、これは視覚的に定義された内部。 私は、この矢印をクリックすると、我々は、私はこの事に名前を与えたことがわかります。 私はそれがshowDivisionsと呼ばれ、これは私が知ることができるようです 何の遷移が行われようとしている、なぜちょうど秒で我々が表示されます。 それは私が私のアプリで異なる画面を有線した方法です。 これはボタン、例えば、テーブルではなくビューだったら、 私は、ボタンをクリックして次の画面にドラッグオーバー制御できる そしてそれは私がそのようにナビゲーションを行うことができる方法です。 本当にすぐに、我々はMasterViewControllerに来れば、 再び、我々は、単に物事のリストを定義しましょう それは、テーブルビューに表示されます。 ここで私は、私はあなたがそのplistファイルを利用したいと言っている と私はあなたが、辞書にそれをロードする そして一度その辞書を持って、私はもう一度、同じ質問に答えるつもりです。 ここではセクションの数です。 一つは、そこにすべてのリーグごとに1つの行があり、各セルのテキスト は最初の1、初のリーグ、2部リーグ、どちらかでなければなりません。 最後に、私は我々がちょうどprepareForSegue呼ば紛れ込んだ、このメソッドを使用するつもりだ、 そしてこれは私がクリックしたときに解雇されるために起こっている方法です これらの行のいずれかにして、したがって、その変遷を活性化 私は矢印で設定した。 これは、私は複数持つことができることを言っている ある画面から別の画面への関係。 私は2つのボタンがあり、各ボタンは、別の画面に移動した場合 私は2 segues、各ボタンの1を持っているつもりです。 しかし、このprepareForSegueは、再利用されようとして、再び、 さまざまな関係のそれぞれについて、私は方法が必要であることを意味しているので、 あなたが最初のボタンを押すか、または2番目のボタンを押した場合に識別する。 私はセグエ名前、このshowDivisionsを与えたときのことを覚えて それは私が今、これが活性化されたセグエであることを知っている方法です。 私がやりたいのは、私は言いたいです 私はちょうど打つかを把握したい、 そしてその結果を得るために、私は、私が選択した行のindexPathをしたいと言うことができます 私はクリックした場所を覚えてindexPathはちょうど言う、 そして私は私が行くよどこに把握したいと言いたい。 このdestinationViewController、セグエのプロパティです。 それは私がするつもりです画面ですが、 ので、私はするつもりです画面がDivisionsViewControllerと呼ばれていることを知っている 私は、そのクラスを作成したので、 そして、今、私はd.divisionsを言えば 私は今、私が行き程度だビューコントローラのプロパティを設定しています。 これは、私が別の画面に1つの画面からデータを送っているかということです。 ちょうどこのDivisionsViewController見 あなたはここで見ることができます。hファイルで 、そこにその財産部門があり、それは、私は基本的に移入するんだよ そう、それは私が私が対応する部署を表示していることを知っている方法です 私はクリックして、もう一度、そのリーグ 実際のテーブルビューはちょうどそれらの質問に答えると、ほとんど同じように見えます シンプルな3つの質問だけでなく、識別 次の画面に移動したときに何が起こるか。 ここでは他の物事のカップルだけ。 現在地上部に気づくことはなく、#includeの格言 私は今、#importを言っている。 これはちょうど、Objective-Cのものです。 インポートは、基本的にインクルードのよりよいバージョンです 例えば、我々は、このクラスが何であるかを知っておく必要があります ので、私はちょうどDivisionsViewControllerを言うことはできません。 私達は私達のcファイルのstandardio.c内部ハッシュタグなかった場合 コンパイラはprintfだったのか見当もつかなかった。 同様に、私はDivisionsViewControllerをインポートしない場合 コンパイラは本当にDivisionsViewControllerが何であるかわからない。 ちょうどあなたが異なる。メートルファイルの内部は、インポートしていることを確認していることを確認してください コンパイラは何が起こっているか知っているように対応する。hファイル。 最後に、どのようなAppleは最終的に、Webビューを使用して、一部のデータが表示されません などのWebビューでは、埋め込むことができるオブジェクトです あなたのアプリの中の小さなウェブブラウザ。 あなたがする必要があるのは、WebブラウザにURLを指定している ので、私は、mlb.mlb.comに行きたい そしてこれは、私は、各チームのホーム·ページにアクセスすることができる方法です ので、このURLに渡すことによって、 Web表示は私のためにこれを表示することができ、私は周りを閲覧することができ、 とシミュレータはその1で使用されています。 さて、これは私のplistから来ました。 私はこれをクリックした場合、これはまた、私のplistのから来て、このスライドは、処理されていました それらseguesを定義することによって。 私は、これをクリックして一つ以上の そして今ここにそうちょうどそのように、私のUIWebViewである ここで私はちょうど埋め込んだURLのウェブサイトでは、だ と私は夢中何も処理する必要はありませんでした。 これは、Webページを表示する方法です。 ここでは、この戻るボタンのようなものが私にも与えられている 完全に無料で私がseguesを使用して、これらの関係を定義しているので。 何か質問?うん。 [学生]だからあなたはallocを使用するときは、無料の何もする必要はありません? 正確には、allocやinitを呼び出したとき、あなたはそれを解放する必要はありません。 IOSは、あなたのためにすべてのことを処理しようとしている。 それは素晴らしいですし、あなたは、任意のルールを破っていない。うん。 [学生]は、画面に合うことができるより多くのチームを含めるとしたら、 それは自動的にスクロールオプションを持っている、またはあなたが追加する必要が何かあるでしょうか? 私はより多くのチームを持っていた場合、正確には、例えば、それが自動的に処理したい 私のためにスクロールし、すべてのパフォーマンスの問題 巨大なテーブルでも私にとっては完全に処理されます。 その他の質問は? このコードの全てが投稿されようとしています。 私達は種類のもので、それ以上の細部を少し上に練り Webビューにいくつかのプロパティを設定するような物事 ちょうどあなたがAppleのドキュメントを参照することによって得ることができるものであり、 本当にある、本当にきれいにレイアウト。 彼らは、サンプルアプリケーションやサンプルの用途の多くを持っている さまざまなAPIのため、間違いなく可能であればそれらに目を通してほしい。 ちょうどいくつかの有用なリンクがあなたを見てみると良いでしょう。 これらは、いくつかの便利なドキュメントのガイドです。 URLは巨大であることから、これらは短縮している。 この最初の1は、ドキュメント全体のライブラリです。 少し検索バーは、ボタンを入力を開始する場合には、あります それはあなたがボタンを使用して実行できるすべてのものについてのすべての情報を与えることを開始します。 私はまた、Table Viewのプログラミングガイドを用意しました。 それは、はるかに詳細にテーブルビューを扱う 動的にセルを追加したり、セルを編集したり削除するようなことをする方法を説明します。 どのようにそれを行う方法を紹介しますアップルからサンプルアプリケーションの多くは、あります そして最後に、この最後の1つは、ヒューマンインターフェイスガイドラインである そして、これは基本的にはUIコンポーネントのいくつかの議論があり、 のようなものが4ピクセルで4ピクセルのボタンを作成しないでください。 それは悪いアイデアだし、Appleはあなたがやりたいことを他の事 良いデザインを奨励する。 我々は最後の仕上げをする前に、すべての最後の質問は? すべての権利は​​、間違いなく議論に特別なラベルを持っているつもり-we'reまでお気軽に。 我々は、iOSの1を持っていきますので、間違いなくそれを利用して自由に感じる。 あなたは、プロジェクトにクラスメートと協力したい場合は またはいくつかのランダムなiOSのようなものを見つけ出す手助け 私に電子メールを送ること自由に感じ、そして間違いなくあるため、すべてのコードをオンライン熟読 ただ時間の関係で、我々はより多くの種類の上に練り 物事のより細かい詳細が表示されます。 しかし、そうでない場合は、あなたのiOSプロジェクトの幸運、そして、私は我々が持っている願っています App Storeでアプリの大きな流入。 [CS50.TV]