2010年4月24日土曜日

XCodeプロジェクトの中身

XCodeプロジェクトの「グループとファイル」の一番上のグループは、「プロジェクト」に必要なソースコードやライブラリのようです。(名前はプロジェクト名になります)

◆Classes
   Objective-C のコードが入ります。通常はここのファイルをコーディングします。

◆Other Sources
Objective-C 以外のコードが入ります。
    ・  *.pch : プリコンパイル済みヘッダ(外部のフレームワークヘッダ等)
      ・ main.m :  メイン関数 main()が記載された実装ファイル(原則変更不要)

◆Resources
アプリケーションのイメージ、サウンド、ムービー、テキストファイル、プロパティリスト等が入る。
      ・  〜 Controller.xlib    Interface Builder が見るファイル
      ・  MainWindow.xlib    メインとなるInterface Builderファイル(nibファイル:nはNext Step<元となったOS>の意味)
      ・  〜 -Infor.plist   プロパティリスト(画面の設定情報)

◆Frameworks
        リンク可能な特殊なライブラリ(???)

◆Products
         生成したアプリケーション(*.app)が入ります。

XCodeプロジェクト アクティブSDK

XCodeでは、動作確認を行うSDKのバージョンとiPhoneシミュレータか実機か等を選択することができます。

方法としては、XCodeを起動して、テンプレートを選択したら、XCodeプロジェクトウィンドウが開きます。そのウィンドウの左上にある「Simulator - ....」というボタンをクリックすると、開発のベースとなるSDKのバージョン、実機かシミュレータか、デバック用かリリース用かが選択できます。

Objective-Cのクラス定義

Objective-Cでは、クラスを以下の2つに分けて定義します。
  • インターフェイス(*.h):クラスのインスタンス変数とメソッドを宣言、スーパクラスを指定
  • インプリメント(*.m):実際のクラス定義とメソッドを実行するコー

◆インタフェース(*.h)

#import  "ItsSuperclass.h"
@interface   ClassName  :  ItsSuperclass //(注)ItsSuperclassを省略するとルートクラスとなる。
    {
         インスタンス変数宣言 //... 継承された型がそのまま利用できる。
    }
         ± (型)メソッド宣言  // ....  クラスメソッド の場合:先頭に+
                                          //      インスタンスメソッド の場合:先頭にー
                                           //      型を省略すると、id型
               // 引数が複数の場合: - (void) setWidth:(float) width height: (float)height;
               // 可変引数の場合: - makeGroup: group, ..... ;
   @end

   @class Rectangle, circle;  // 継承関係のないクラスの利用の場合(よくわからん..)


◆インプリメント(*.m)

   @implementation ClassName : ItsSuperclass // ItsSuperclassは省略可
      {                                   //省略可
        インスタンス変数宣言 // 省略可
      }                                  //省略可
        ± (型)メソッド定義: (型)変数
       {
           メソッドの実装
                    //引数が複数の場合、va_list ap; va_satrt(ap, group); 等
                    //インスタンス変数がレシーバでないオブジェクトに属する場合:
                        //よくわかりません。(Objective-C Programming P.42)
                    // selfの用法:よくわかりません。
       }
    @end

はい、はい、まだまだ道はながそうです。

  • オブジェクトの割当と初期化
  • プロトコル
  • 宣言済みプロパティ
  • カテゴリと拡張
  • 関連参照
  • 高速列挙
  • 静的な動作の実現
  • セレクタ
  • リモートメッセージング

Objective-Cの概念

iPhoneのコーディングには、Objective-Cの理解が欠かせないようです。
といっても難しいですね。簡単にまとめてみます。
  • クラス:同じインスタンス変数、メソッドを持つオブジェクトの集合(種類)
  • メンバ:あるオブジェクトは、特定の種類のクラスのメンバ

    • オブジェクト:データ(インスタンス変数)と操作(メソッド)を一塊にしたもの。実行時に動的に「インスタンス」として生成される。型:id (isa変数), 通常オブジェクト名で宣言する。ex. Rectangle *myRectangle;
      • インスタンス変数:オブジェクトの状態を保持するデータのこと(通常隠蔽される)ただし、以下の4段階で解放される。
        • @private ....  クラス内のみ
        • @protected …  クラス及び継承するクラス(デフォルト)
        • @package... クラス実装内のどこからでもアクセス可
        • @public … どこからでもアクセス可
      • メソッド:オブジェクトを操作する関数(機能)のこと。オブジェクトには原則メソッドを使ってアクセスする。

        • スーパクラス:あるクラスの親(継承元)となっているクラス
        • サブクラス:あるクラスを継承して作成したクラス
          • メソッドの同一名称による宣言:サブクラスでのメソッドのオーバライド(インスタンス変数はオーバライドできない)
          • super:オーバライドしていても、スーパクラスからメソッドを検索する。
          • self:自分からメソッドを検索する。

          • インスタンス:オブジェクトを実行するために、メモリ上に展開されたオブジェクトの実体
          • インスタンスの生成:allocメソッド(インスタンス変数を全て0にする)、及びinitメソッド(完全に初期化する)を用いる。id  xxxx  = [[ クラス名 alloc] init]、または、オブジェクト名* xxxx = [[ クラス名 alloc] init]
          • クラスオブジェクト:クラス毎にそのクラスのインスタンスを生成/管理するオブジェクト

          • オブジェクトメッセージング:オブジェクトに対するメソッドの実行指示
            • 構文:[ receiver message ];
            • receiver:オブジェクト名
            • message:メソッドと引数。メソッド名(セレクタとも言う):引数 で表現される。引数が複数ある場合:「メソッド名X:Y:」 で実装または、コロンで区切って実装 [receiver メソッド名: x, y, z]

            iPhoneSKDのダウンロード

            前の投稿が消えてしまったので再掲です。

            iPhoneアプリ開発のためには、まずiPhoneSDKのダウンロードが必要です。

            しかし、容量が桁違い。2.5GBもあります。びっくり。
            AppleはこれだけのリスクをもってiPhoneを開発したんだと、ただただ、スティーブへの尊敬の念を持ってやみません。

            日本の会社のトップにこれだけの開発を指揮できる人はいないでしょうね。このような歴史と背景があることの存在すら知らず、何故差があるのかを理解できないのだと思います。

            iPhone開発の制約

            iPhone開発にあたっては、以下の制約の考慮が必要なようです。

            • メインメモリ: 128MBですが、他のリソースもあり、64MB程度の範囲でプログラムする必要があるようです。さらにメモリが逼迫してきた場合、通知があり、メモリ解放をしないと停止させられるそうです。
            • 終了処理: ホームボタンが押されるなど、終了通知があった場合は、必要な情報を保存し、5秒以内に終了しないと情報は失われるそうです。

            iPhone Developer Program

            iPhone 実機でのテストや、Appleストアでの配信のためには、有償のiPhone developer Program への加入が不可欠です。

            年間参加費 ¥10,800-ですが、Apple への敬意ということでしかたないですね。

            アドレスは以下となります。
            http://developer.apple.com/jp/programs/iphone/

            もっとも自信が持てるまでは、加入は見送りたいと思います。

            MacでDVD-RAM

             PCのDVD-RAMが余っていたのでMacで使ってみようと思い付き、写真をDVD-RAMにコピーしてみました。ところが何故か容量以下のファイルしか書き込むことができません。

             そこでゼロからやり直そうと、ディスクユーティリティでUDFフォーマットを選択すると途中でエラーが出て、そこから進みません。

             悩んだあげく、結局FATでフォーマットすると容量一杯つかえるようになるようです。ただし、書き込み時間が数時間....ま、しょうがないか。

            しかし、Macに慣れるまで時間かかるなぁ....

            2010年4月23日金曜日

            iPhone開発初心者は、まずどの本を購入すべきか

            ちまたにはiPhone開発の本が多数あり、どれを買うべきか迷ってしまいます。と、言うよりリファレンスや解説は、本来はiPhone Developerサイトにあるため、本来何も買わないでできる「はず」です。

            では、何故iPhone開発本を買わなくてはならないのか。それは、iPhone Developerサイトの多くのドキュメントを読み切るには、時間に制約のあるなか、おのずと限界があるためです。

            iPhone開発の場合、本を買うという行為は、リファレンスを買うというよりは、時間短縮のため、またはリファレンスやサンプルソースを読めるようになるまで導いてもらう、という位置づけになるでしょう(入門書、コンコン...)。もしくは、整理されたTipsを手軽に入手する、という位置づけになるかと思います。

            自分は、というと、サイトの現状もわからず、目的も明確にしないまま、どれを買っていいかわからず、たくさん買ってしまいました。

            最初に買った本は、比較的わかりやすかったのですが、肝心なものがありません。アプリケーションを良いものにするのは、第一に「コンテンツが充実している」こと、ですから、「データ」をどこからかもってこなければなりません。インターネット(Google等)が理想ですが、そこまでのものを作るには山がありすぎ、時間を無駄に浪費してしまいます。そこで出番なのが、写真アプリです。簡単にPCからダウンロードできますので、ユーザにお願いするにも簡単です。ところが、その本には、肝心の作ろうと思っていた写真アプリからの画像取り込みがないっぽかったです。←最後まで読めよ、俺。

            何かいい情報はないかと、いろいろとググると、その機能を持つクラスが、UIImagePickerControllerであること見つけました。そこで本屋さん(ビックカメラ有楽町店)で立ち読み攻撃。このクラスの解説がある本を見つけ、速攻で買ってしまいました。しかしわかりずらい ←ちゃんと読めよ。俺。

            翌日、またビックカメラで立ち読み攻撃... かえろうかと思いつつ、真っ赤な本を取ると... ありました。入門書。これぞ入門書。段階を追って、高度なインターフェースを作るまで導いてくれる書。はじめからこれだけ買えばよかった...

            ということでお勧めです。みなさんは無駄な時間やお金は使わないように。← 読み切ってから勧めろよ。俺。

            2010年4月22日木曜日

            AppleのDeveloperサイト

            今更ですが、iPhoneの開発にはAppleのDeveloperサイトから情報を得るのが基本です。

            まず、http://developer.apple.com/jp/ へ行きます。

            ここから、iPhone Dev Centerをクリックします。
            すると、英語サイトが現れ、挫折します(笑)

            そこであきらめずに、日本語サイトに直接行きます。
            http://developer.apple.com/jp/iPhone/library/japanese.html

            MacでTV

            iMacでテレビを見る際は、一般にビクセラ社の3波チューナなどをつけるようです。
            しかしながら、ゲームを表示させたり、ケーブルテレビ会社のチューナを見るには、外部入力がなく不便です。HDDレコーダしかり。

            そんなときはアナログ入力のキャプチャ機器がよさそうなのですが、4:3/16:9の変更だとか、ゲームのリアルタイム表示ができるのかがわからず躊躇してしまいます。

            で、いろいろ探しましたが、ついに見つけました。
            mathey VIDEO CAP For Mac MVCP-02MAC
            です。Amazonで★★★★★です。お勧め。

            写真/カメラ画像を取り込もう。

              写真アプリやカメラ画像(含む動画)を取り込むには、UIImagePickerControllerクラスとその親クラスのUIViewControllerクラスを使い、UIImageクラス等に表示するそうです。また、画像情報の縮小/切取りは、UIImagePickerControllerクラスで機能を指定すれば良く、さらに加工したいときは、UIGraphicsを使うようです。より高度が画像加工をするときは、ここでは触れませんが、UIKitではなくC言語APIのCore Graphicsフレームワークを使うそうです。
            ・サンプルコード(UIKIt のUIImagePickerControllerのリファレンスにあります)
                 iPhoneCoreDataRecipes
                 PhotoLocations
            --------------------------------------------------
            ◆UIImagePickerControllerクラス iPhoneアプリで画像を扱う際に、既存のカメラで画像を取得したり、写真アプリから画像を選択する場合に使用するようです
            ー sourceTypeプロパティ
            Image Pickerがどのようなタイプの機能(Source)にアクセスするかを指定するには、sourceTypeプロパティを使うそうです。Typeはそれぞれ定数で決められており、次で指定します。
            • UIImagePickerControllerSourceTypePhotoLibrary  フォトライプラリ(デフォルト値)
            • UIImagePickerControllerSourceTypeCamera カメラ
            • UIImagePickerControllerSourceTypeSavedPhotosAlbum iPhoneの場合:カメラロール、iPod touchの場合:「Saved Photos」フォルダを開く
            ー allowsImageEditingプロパティ
              Image Pickerによる「画像」の拡大縮小・切取り(クロップ)の可否を指定するには、このプロパティで指定するようです。
              ー +(BOOL)isSourceTypeAvailable:メソッド
              当該ソースタイプが動作している環境で使用可能かをチェックします。
              --------------------------------------------------
              ◆UIViewControllerクラス
              UIViewControllerクラスは、UIImagePickerControllerクラスの親クラスであり、イメージピッカーの表示にUIViewControllerのpresentModalViewController:animated:というメソッドを使用するそうです。
              -------------------------------------------------- 
              ◆Picker表示までのプロセス
              • 動作可能かチェック(isSourceTypeAvailable:)
              • UIImagePickerControllerのインスタンス化(UIImagePickerController* imagepick)
              • 初期化(imagepick=[[UIImagePickerController alloc] init])
              • 各プロパティを設定(imagepick.プロパティ = 値)
              • 自身をデリゲートとして設定(imagepick.delegate = self)
              ◆Picker表示後のプロセス
              • Pickerを隠す (self dismissModalViewControllerAnimated:YES
              • UIImagePickerControllerを使った写真の撮影が終了すると、デリゲートメソッドであるimagePickerController:didFinishPickingImage:editingInfo:が、呼び出される。
              • 上記引数のUIImageにある写真は、320x320(スクリーンサイズにマッチ)
              • オリジナルデータ上記引数の(NSDictionary)editingInfoを使う(1200x1600:カメラの場合)
              • editingInfoにはユーザの編集情報もあり、UIImagePickerControllerCorpRectで取り出す。
              • 取り出したデータは、UIImageViewクラスのimageプロパティで表示する

              iPhoneシミュレータの「写真アプリ」に画像を入れる方法

              iPhoneシミュレータの写真アプリに画像を入れるには、シミュレータに画像をドラック&ドロップし、Safariで開いたところを長押ししてあげればいいようです。

              iPhone ガイドライン/リファレンス

              iPhoneヒューマンインタフェースガイドラインの日本語版がないので、諦めかけていたらありました。ちょっと、本買っちゃったよ.....

              ドキュメントは基本的に以下にあります。
              ◆Apple開発者サイト http://developer.apple.com/jp/

              しかし、へたにクリックすると英語サイトになったりリンク切れも多く、日本語のドキュメントを見つけることができません。

              しかしここに日本語ガイドのリンクがありました。ただしPDFです。
              本来はHTMLの方が使い勝手がいいのですが、検索でたまに見つかるだけでした。
              ところがURLをいじってみると秘密がわかりました。英語ドキュメントを開いて、URLのwww.apple/com/〜 の間に/jpを入れます(www.apple/com/jp/〜)。そして運がよければ(^^;; 日本語になります。

              現在の日本語化の状況はこんな感じです。
              ■ガイド
              ■リファレンス
              ■コーディング How to はこちら
              ■コードサンプルはこちら
              ■その他
              だけど読んでいる人いるんだよなぁ...不思議
                ■その他 翻訳プログラム
                高校生が一生懸命UIKitリファレンスを訳してくれています。
                だいじょうぶか?Apple??

                  階層メモ(Macアプリ)

                  開発用のアイディアも溜まってきたので、忘れないようにメモソフトを探しました。
                  調べてみると"Remember"というソフトがあり、使い勝手もとてもいいものでした。

                  画面右上のメニューバーに常駐することもできます。お勧めです。

                  iPhone OSのライブラリ

                  iPhone OSのライブラリには以下のものがあるようです。詳細は、Appleが発行している「iPhone OSテクノロジーの概要」の「iPhone OS テクノロジー」を参照ください。これでなんとか全体像がつかめました。まだまだ勉強しなくてはならないこはたんまりありそうです.......
                  Cocoa Touchレイヤ GUI、イベント、ウィンドウやビュー、プッシュ通知やピアツーピア接続等
                  • Apple Push Notification   文字通知、音声警告、アイコンへの数値付与
                  • Address Book UI 連絡先作成/編集画面
                  • Message UI 電子メールメッセージの作成、編集、キューイングIF
                  • MapKit 注釈(ピン等)を付けられるスクロール可能な地図画面
                  • Game Kit ボイス/ピアツーピアネットワークIF
                  • UIKit コピペ、ウィンドウ、タッチ、テキスト、Web表示、加速度/近接センサ、カメラ、、画像、バッテリ、障害者画面等  詳しくはこちらUIKit Framework Reference)
                  ●Mediaレイヤ グラフィックス、オーディオ、動画再生等
                  (1)グラフィスク
                  • Quartz Core ベクトル(2D)描画エンジン、座標変換、PDF作成等
                  • Core Animation アニメーション/合成(他の画像部品にも適用)
                  • OpenGL ES 2D/3Dの描画ツール
                  (2)オーディオ
                  • Audio Toolbox オーディオの再生と録音のためのインターフェイス/データ等
                  • Audio Unit オーディオユニットとそのインターフェイス等
                  • AV Foundation オーディオの再生と録音のためのインターフェイス
                  • Core Audio Core Audio全体で使われるオーディオデータタイプの提供
                  • OpenAL OpenAL(オーディオライブラリ)用のインターフェイス等
                  (3)ビデオ
                  • Media Player ビデオを再生のインターフェイス等
                  ●Core Servicesレイヤ 配列や集合、文字列、日時、連絡先、MVCデータモデル、現在地情報の取得等
                  • Address Book ユーザの連絡先データベースに直接アクセスするインターフェイス等
                  • Core Data データモデルを管理するためのインターフェイス等
                  • Core Foundation 基本サービス(一般的なデータ型の抽象化、文字列ユーティリティ、コレクションユーティリティ、リソース管理、環境設定など)。
                  • Core Location ユーザの位置を決定するためのインターフェイス等
                  • Foundation Cocoa Foundationレイヤ用のクラスとメソッド等。XML要素の抽出、XML->HTML変換
                  • Mobile Core Services システムによってサポートされるUTI (Uniform Type Identifier)の定義
                  • Store Kit In App Purchaseに関連付けられた会計処理を扱うためのインターフェイス
                  • System Configuration デバイスのネットワーク設定を判別するインターフェイス
                  • SQL lite ローカルにデータベースを作成する
                  ●Core OSレイヤ カーネル環境、ドライバ、仮想メモリ、スレッド処理、ファイル、ネットワーク、セキュリティ等
                  • CFNetwork Wi-Fi無線と携帯電話網を使ったSSL,DNS,HTTP/HTTPS/FTP/Bonjour/BSDソケット通信を実行する。
                  • External Accessory 接続ハードウェアと通信するためのインターフェイス
                  • Security 証明書、公開鍵と非公開鍵、および信用ポリシーを管理
                  • IOKit デバイスのインターフェイス(直接のインクルードは不可)
                  • System ファイル、I/O, メモリ割当、演算

                  UIKit Class hearalkey

                  UIKitフレームワークは、iPhone、iPod touch、iPadのAPI構築に必要なクラスを提供します。

                  核となる機能セットは以下の通りです。
                  なお、個々のライブラリは高校生が訳してくれています。



                  ・加速度センサー(UIAcceleration,UIAccelerometer)
                  ・障害者用キット(UIAccessibility Element)
                  ・バーアイテム(UIBarItem, UIBarButtonItem,UITabBarItem)
                  ・グラフィクス(UIBezierPath)
                  ・カラー(UIColor)
                  ・充電/近接センサー等デバイス(UIDevice)
                  ・ドキュメント(UIDocumentInteractionContoller)
                  ・タッチ/モーション等イベント(UIEvent)
                  ・フォント管理(UIFont)
                  ・ジェスチャー(UIGestureRecognizer)
                  ・画像表示(UIImage)
                  ・テープルデータ加工(UILocalizedindexedCollation)
                  ・メニュー(UIMenuController)
                  ・階層ナビケーションコントローラ(UINavigationItem)
                  ・コピー/ペースト(UIPasteboard)
                  ・ポップオーバコントローラ(UIPopoverController: for iPad)
                  ・画面サイズ(UIScreen)
                  ・スクリーンモード(UScreenMode)
                  ・検索表示(UISearchDisplayController)
                  ・テキスト分析(UITextRange, UITextInputStringTokenizer, UITextPosition)
                  ・タッチ/モーションイベント管理(UITuoch, UIRespnder)
                      - UIApplication
                      - UIView
                  • ウィンドウ管理 (UIWindow)
                  • ラベル/テキスト表示 (UILabel)
                  • 日付/時刻選択表示 (UIPickerView)
                  • タスクの進捗表示 (UIProgressView)
                  • 動作中表示 (UIActivityIndicatorView)
                  • 画像表示  (UIImageView)
                  • タブ/ボタン表示 (UITabBar)
                  • ナビゲーション(上)バー (UINavigationBar)
                  • (UITableViewCell)

                  iPhone開発に有用なサイト

                  どうも書籍だけでは必要な情報が得られません。

                  ということで、iPhone開発に有用なサイトを見つけたら、ここに記載したいと思います。

                  Googleカレンダーとの同期について
                  http://fanfanfan.net/?p=247
                  http://www.moongift.jp/2009/07/iphone_gcal/
                  http://code.google.com/p/iphone-gcal/

                  iPhoneアプリ開発で稼げるのか
                  ちょっと無理っぽいですが、無料アプリに有料アプリ広告を載せると売り上げがあがるっぽいです。この方は5本つくって年間50万円。投資と合わせて年間3000円??

                  http://iphone.longearth.net/

                  さてきびしい道のりですが、アフィリエイトよりはましかな。

                  iPhoneテンプレートの種類

                  iPhoneでは予め7種のテンプレートが用意され、
                  これをベースに開発を進めます。


                  ・Navigation-based Application
                  アイテムリストを表示するためのナビゲーションコントローラを使うテンプレートです。

                  コアデータを格納(Use Core Data for strageを選択)する場合、取得したリザルトコントローラを使って管理されたアイテムリストを表示するテンプレートとなります。
                  Core Data は MVC アーキテクチャの Model を補完するものです。iPhone 3.0 以前は SQLite などを使用していたのを Core Data を使って SQL を書くことなくデータペースアプリケーションを作れます。

                  http://www.syuhari.jp/blog/archives/1860

                  チュートリアル、サンプルコードについても記載があります。


                  ・OpenGL ES Application
                     OpenGL ESペースのビューを使うテンプレートです。アニメーションを表示するOpenGL ESによるシーン、タイマーを描画する場合に使用します。

                  ・Split View-based Application
                     スプリットビューコントローラと、master-detail型の2つのビューのコントローラでアプリケーションを作成するテンプレートです。
                  これを動かすとデカイウィンドウがでてきます。どうやらiPhone用といいながら、iPad用アプリケーションのようです。

                  ・Tab Bar Application
                  タブバーとタブバーアイテムのためのビューコントローラで構成されるアプリケーションを作成するテンプレートです。

                  ・Utility Application
                  メインビューとフリップスタイルビューを持つアプリケーションを構成するためのテンプレートです。メインビューをフリップさせるためのinfoボタンと、メインビューに戻るためのDoneアイテムを持つナビゲーションバーで構成されます。

                  ・View-based Applicaton
                  シングルビューのアプリケーションのテンプレートです。

                  ・Windows-based Application
                  一つのウィンドウとアプリケーションデリゲートのみのテンプレートです。

                  アクションメソッドとアウトレットとアプリケーションデリゲート

                  アクションメソッドとアプリケーションデリゲートの違いがわかっていないのでここで整理します。

                  ■アクションメソッド:
                   呼び出し側のイベントにより、当該オブジェクトのインスタンスを呼び出すために、当該インスタンスを(IBAction)で識別、Interface Builderに明示し、InterfaceBuilderのユーザインタフェースに表示されるため、インスタンスと呼び出し側オビジェクとをリンクします。ここのインスタンスで取得されるsenderは、呼び出し側のオブジェクトそのものとなり、当該オブジェクトのメソッドも利用可能となります。

                  AppDelegte.h のクラス宣言でメソッドプロトタイプ宣言の返り値に(IBAction) を指定します。
                  ----------------------------------------------------------------------------------------
                  @interface xxxAppDelegate : NSObject <UIApplicationDelegate>{
                      // インスタンス変数宣言
                  }
                     // メソッドプロトタイプ宣言
                    -  (IBAction) action : (UITextField *) sender ;
                  // forEvent : (UIEvent *) event を書くとさらに時刻やタッチされた座標等の追加
                  // 情報を得ることができます。

                  @end
                  ------------------------------------------------------------------------------------------
                   これにより、Interface Builder上でアクションメソッドとして表示されます。

                  さらにInterface Builderにより、ボタン等のクラスの動作(Event)と
                  結びつけられることで、イベント発生時に呼び出されます。

                   呼び出された後の動作は、AppDelegate.mに記述します。

                  <関連付けクラス(Event) ⇒ アクションメッソドが呼び出される。>


                  ■アウトレット
                  アウトレットは、メソッドプロトタイプ宣言ではなく、インスタンス変数宣言に記載します。
                  ----------------------------------------------------------------------------------------
                  @interface xxxAppDelegate : NSObject <UIApplicationDelegate>{
                  // インスタンス変数宣言
                  }
                  // メソッドプロトタイプ宣言

                  @property ( nonatomic, retain) IBOutlet UIWebView* WebView;

                  @end
                  ------------------------------------------------------------------------------------------
                  これにより、Interface BuilderのOutlet(コンセントの意)が現れ、ユーザインタフェース等の
                  クラス(インスタンス)そのものと関連づけます。
                  この関連付けにより、xxxAPPDelegate.m に当該インスタンスとそのメソッドを直接呼ぶことができるようです。

                  例:[ webView loadRequest : urlReq ];

                  <アウトレット宣言クラス ⇒ 関連付けクラスのメソッド等を呼び出すことができる>

                  ■アプリケーションデリゲート
                   アプリケーションデリゲートは、アウトレットの一種であり、UIApplicationがデフォルトで保有するアウトレットとして、deligateが宣言され、Interface Builderから見ることができます。

                  <UIApplicationのアウトレット(deligate) → 関連付けクラスに記載されたアウトレット指定のメッソドを記述すればUIApplicationから必要時に呼び出だされる>

                  やっと理解できました。ほっ。

                  アプリケーションデリゲートが呼ばれるタイミング

                  アプリケーションデリゲートは、以下のような場合に呼ばれ、iPhoneの動作に備えます。
                  • アプリケーションの起動
                         アプリリケーションの起動時:applicationDidFinishLaunching:
                         アプリケーションのアクティブ時:applicationDidBecomeActive:
                  • 着信など
                         アプリケーション非アクティブ時:applicationWillResignActive:
                  • 終話など
                         アプリケーションのアクティブ時:applicationDidBecomeActive:
                  • ホームボタン押下など
                         アプリケーション終了時:applicationWillTerminate:

                  ブラウザが動いた

                  ブラウザ作りましたが動かない....入力して「Go」を押しても反応なしです。
                  いろいろいじっているうちに....動きました...うーん、よくわからん.....ま、いっか。

                  アウトレットとは

                  予めInterface Builderで生成されているインスタンス(ここではUIWebView)をAPPDeligateで宣言した変数に組み込むには、IBOutletという形で明示してヘッダファイルで型を宣言するようです。
                  そうすると、ソースファイル上で宣言する必要はなく、AppDeligateのOutlet変数をInterface BuilderでWindow上に貼付けたWebViewへドラックすることで関連付け組み込むことができるそうです。

                  @interface Web_blowserAppDelegate : NSObject {
                  IBOutlet UIWebView* webView;
                  UIWindow *window;
                  }

                  CoCoA プログラミング TIPS

                  iPhoneでの開発にあたっては、CoCoa のクラスライブラリやメソッド/データ型の知識をもってプログラミングしなくてはなりません。

                  しかしながら、Appleの開発者サイトはほとんんど英語。日本語で手短かに理解する方法を得なくてはなりません。

                  いろいろ調べていくと、よさそうなサイトがありました。
                  「COCOA PROGRAMMING TIPS 1001」

                  Objective-Cの実行コード(ソース)ファイル(*.m)

                  ヘッダファイルでのメソッド定義、Interface Builderでの関連づけのあとは、実際のクラスの生成、動作を記述する実行コードを記載するソースファイルを作成します。

                  すでに AppDelegate.hの#import、@implement、@endの記述はありますので、メソッドの呼び出しを間に記載します。

                  先頭には、プロトタイプ宣言と同じものを記載し、{}で囲み、中で計算やメソッドの呼び出しを記載するようです。返り値がある場合はC言語と同様にreturn();で返します。

                  (1)引数のないメソッドの呼び出し方法
                  [ voice sayHello ]; (voiceという名前のオブジェクトsayHelloメソッドを実行)
                  [ オブジェクト名(レシーバ名とも言う)  メソッド名(セレクタ名とも言う) ];

                  (2) 引数が1つのメソッドの呼び出し方法
                  [ voice sayHello: "Hello" ];
                  [ オブジェクト名 メソッド名 : 引数名 ];

                  (3) 引数が複数のメソッドの呼び出し方法
                  [ voice sayHello: "Hello"
                  speed : 1
                  pitch   : 2  ];
                  [オブジェクト名 メソッド名+引数1の説明 : 引数1の名前
                                 引数2の説明: (引数2の型) 引数2の名前
                                                                                     :
                                     引数nの説明: (引数nの型) 引数nの名前];
                  (4)引数のネスト方法
                  以下のネストも可能です。
                  [ オブジェクト名 メソッド名 : [オブジェクト名 メソッド名 ] ];
                  [ オブジェクト名 メソッド名 ]  メソッド名 ];

                  ------------------------

                  Objective-Cのヘッダファイル(*.h)

                  ヘッダファイルでは、クラスに含まれるインスタンス宣言(オブジェクトのひな形の定義)や、メソッドのプロトタイプ宣言(関数などの呼び出し方を既定する宣言文)を行います。

                  ------------- APPDelegate(標準メソッド等以外の設定先)の例----------------------
                  #import

                  @interface Web_blowserAppDelegate : NSObject 
                  <UIApplicationDelegate>
                  {
                      UIWindow *window;
                  }

                  @property (nonatomic, retain) IBOutlet UIWindow *window;
                  -(IBAction) loadUrl: (UITextField *) sender;

                  @end

                  ------------------------------------------------------------
                  解 説
                  ------------------------------------------------------------
                  ★ #import <ヘッダファイル>
                  他のヘッダを含めて実装する宣言です。C言語では#includeとなりますが、Objective-Cでは#importとし、多重定義を自動で回避してくれるそうです。
                  -------------------------------------------------------------
                  ★ クラス宣言
                  @interface @endで囲んで宣言します。
                  @interface クラス名:スーパークラス<プロトコル1, プロトコル2, ............>
                  {
                   インスタンス変数宣言
                  }
                   メソッドプロトタイプ宣言
                  @end
                  ------------------------------------
                  ★ インスタンス変数(フィールド、データメンバ、メンバ変数、属性<呼び方いろいろありすぎ(@@;;>)宣言
                  型名 変数名;

                  型には以下のようなものがあります。
                  ・整数型
                  ・実数型
                  ・文字列型
                  ・クラスオブジェクト型(オブジェクトを保持する変数<ポインタ>)

                   
                     UIWindow *window;

                   クラスオブジェクト型のUIWindow型の変数(Window)を宣言する場合は上記のようにポインタで宣言します。
                  -------------------------------------------------------------
                  ★ メソッドプロトタイプ宣言
                  クラスに対するメソッド(クラスメソッド<インスタンスを生成するメソッド、クラス全体に対する情報取得のメソッド(画像フォーマット等))の場合は”+”、インスタンスに対するメソッドの場合は"ー"を先頭にを書くそうです。


                  (1)引数<メソッドに渡す値>のないメソッドの場合
                  -(void) sayHello;
                        -(返り値の型) メソッド名;

                  (2)引数<メソッドに渡す値>が一つのメソッドの場合

                  -(void) sayMessage: (char *) message;
                        -(返り値の型) メソッド名: (引数の型) 引数の名前;

                  (3)引数<メソッドに渡す値>が複数のメソッドの場合

                  -(void) sayMessage: (char *) message
                       speed:(int     ) speed
                                            pitch: (int      ) pitch;
                        -(返り値の型) メソッド名+引数1の説明: (引数1の型) 引数1の名前
                                    引数2の説明: (引数2の型) 引数2の名前
                                                                                     :
                                      引数nの説明: (引数nの型) 引数nの名前;
                         *)引数の説明は省略化
                  ----------------------------------------------------------------------------------------
                  この事例では、UITextField * でURLの入力を拾い受け渡すメソッドを定義しています。
                  返り値にIBActionを指定することで、Interface BuilderのGUIを使ってアクションを結びつけることができます。ファイルを「保存」したあと(でないとできません)、UITextFied のDid End On Exit という入力完了アクションを、Inspectorウインドウ上のApp Deligateにドラックすることで、関係をつけることができます。


                  -------------------------------------------------------------
                  参考:
                  NSObject:
                  iPhone OSのクラスのほぼ全てのルートクラス(トップのクラス)だそうです。

                  オブジェクト指向概念の理解(カテゴリ)

                  Objective-Cでは、ソースコードがなく実行ファイルとしてのみ提供されているクラスにメソッドを追加することができ、その機能をカテゴリと呼ぶそうです。

                  オブジェクト指向概念の理解(継承、スーパクラス、サブクラス)

                  クラスの定義を他のクラスに受け継がせることを「継承」と言う。その際、元になるクラスを「スーパークラス」(super class)、あるいは「基底クラス」「基本クラス」(base class)などと呼び、継承により新たに定義されたクラスを「サブクラス」(subclass)、あるいは「派生クラス」(derived class)と呼ぶ。

                  Object-C/C++で、スーパクラスは1つのみとなり多重継承(複数のクラスから継承)を禁止する一方で、メソッド宣言の集合体(プロトコル)を複数継承する仕組みがあるそうです(Javaと同様)。

                  オブジェクト指向概念の理解(オブジェクト、クラス、インスタンス、メソッド)

                  iPhoneのプログラミングは、主にC言語を拡張したオブジェクト指向言語であるObject-C, Object-C++でコーディングされます。

                  オブジェクト指向プログラミングにあたっては、その概念の理解が必要となります。

                  オブジェクト指向プログラミングにおいては、ソフトウェアが扱おうとしている現実世界に存在する物理的あるいは抽象的な実体(オブジェクト)を、属性(データ)と操作(メソッド)の集合として モデル化し、コン ピュータ上に再現します。

                  オブジェクトを定義するモデルはクラスと呼ばれる。クラスに基づいて実際にコン ピュータメモリ上に 展開されたオブジェクトのことをインスタンス(実体)と言うが、このインスタンスの意味でオブジェクトと呼ぶ場合も多い。

                  概念     コード  実行モジュール
                  オブジェクト ≒ クラス ≒ インスタンス

                  例えば「名前、身長、体重」というクラスがあるとすれば、そのインスタンスは「田中、175、65」というように作られる。一つのクラスから複数のインスタンスを作ることができ、それぞれのインスタンスは違った値を持ちうる。プログラムの中で実際に扱われるのはクラスではなく、こうして作られたインスタンスの方となる。「○○クラスに属す るインスタンス」「○○クラスのインスタンス」という表現が用いられる。

                  メソッドのうち、ボタンなどの操作にともない用意するメソッドを「アクションメソッド」といいます。開発者が考え実装します。

                  また、アプリケーションが起動したときなどに、アプリケーション固有の動作を行うオブジェクトのことを「デリゲート(Delegate、代理人)」と呼び、アプリケーションのデリゲートをとくにアプリケーションデリゲートととも言います。決められたオブジェクトを登録するのみとなります。

                  アプリケーションデリゲートクラスは、“Files Owner" のdelegateアウトレットと接続します。

                  クラスに機能を追加するという意味で、サブクラスとデリゲートは同じですが、デリゲートの方が、「場合により」外部に違う処理を依頼できる等柔軟性が高いものとなります。

                  iPhoneアプリのコーディングの基本

                  iPhoneで最初に動作するコードが書かれているのが、Other Sourcesにある"main.m"となります。
                  ---- main.m -------------------
                  #import

                  int main(int argc, char *argv[]) {

                  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
                  int retVal = UIApplicationMain(argc, argv, nil, nil);
                  [pool release];
                  return retVal;
                  }
                  ----------------------------------

                  この場合、main.mから呼び出されるUI Applicationで標準化された処理を実行することになるそうです。

                  標準化されていない処理を実行させたい場合には、main.mを直接コーディングすることはあまりなく、UI Applicationから標準以外の処理を依頼する"xxxAppDelegate"クラスをコーディングすることになるそうです。

                  そのため、コーティング対象はClassesフォルダにある、“xxxAppDelegate.m", "xxxAppDelegate.h"上でコーディングしていくことになるそうです。

                  ボタンを押した際のイベントを設定する。

                  ボタンを押した際のイベントは、Interface Builderから簡単に設定できます。

                  InspectorウインドウのConnectionタブにあるRecieved Actionの○を、関連づけたいボタンにドラックすれば完了です。

                  ただし、このActionがないものについては、コーディングが必要になります。

                  テキストを入力する(UITextField)

                  iPhoneでテキスト入力を配置する方法の一つ に、UIToolbar(横幅に合わせて部品を配置するための部品)の上に、UITextFieldという部品を置く方法があります。
                  • 文字列がないときの補足説明:Placeholder
                  • 文字列クリアボタンの表示:Clear Button
                  • 文字列編集前に全消去する:Clear When Editing Begins
                  • フォント:”ヒラギノ角ゴProN W3,W6"
                  • 表示枠に収まらない場合に文字列を小さくする:Font Size/Adjust To Fit (Min Size)
                  • 大文字化を指定する:Capitalize
                  • 文字列を訂正する:Correction
                  • キーボードの種類を指定する:Keyboardで、デフォルト/ASCII/数字・記号/URL/数字/電話/アルファベット・電話/メールアドレスの各用途のものが指定できます。
                  • アラートパネル用にする:Appearance
                  • 入力完了キーを指定する:Return Keyでデフォルト/Go/Google/Join/Next/Route/Search/Send/Yahoo/Done/Emergency Callから選択できます。
                  • 何も入力されないときにReturn-Keyを無効にする:Auto-enable Return key
                  • パスワード入力用:Secure
                  を使用します。

                  ボタンを配置する(UIBarButtonItem)

                  iPhoneでボタンを配置する方法の一つに、UIToolbar(横幅に合わせて部品を配置するための部品)の上に、UIBarButtomItemというボタンを置く方法があります。
                   
                  ボタンは左から順番に配置されるため、間を開けるには、Flexible Space Bar Buttom Itemというボタンを配置するそうです。
                   
                  UIBarButtonItem のIDにはその他に以下のものがあるようです。
                  ちなみに、言葉が入っているボタンは自動で各国の言語に変換してくれるそうで、メチャクチャ便利ですね。
                       ---------------
                  image: ../Art/UIBarButtonAdd.png Add
                  Edit
                  Done
                  Cancel
                  Save
                  image: ../Art/UIBarButtonSystemItemUndo.jpg Undo
                  image: ../Art/UIBarButtonSystemItemRedo.jpg Redo
                  ----------------------
                  image: ../Art/UIBarButtonCompose.png Compose
                  image: ../Art/UIBarButtonReply.png reply
                  image: ../Art/UIBarButtonAction.png action
                  image: ../Art/UIBarButtonOrganize.png organize
                  image: ../Art/UIBarButtonTrash.png trash
                  ----------------------
                  image: ../Art/UIBarButtonBookmarks.png bookmarks 
                  image: ../Art/UIBarButtonSearch.png search
                  image: ../Art/UIBarButtonRefresh.png refresh
                  image: ../Art/UIBarButtonStop.png stop
                  ----------------------
                  image: ../Art/UIBarButtonCamera.png camera
                  ----------------------
                  image: ../Art/UIBarButtonPlay.png play
                  image: ../Art/UIBarButtonPause.png pause
                  image: ../Art/UIBarButtonRewind.png rewind
                  image: ../Art/UIBarButtonFastForward.png fast forward

                  Macでアニメーション

                  魅力的なアプリを作るには、出だしがアニメーションで始める必要があると考えています。そのためには、アニメを作るMacアプリが必要になるかと思います(Windowsでもいいけど)。
                  Vectorを見るとこんなソフトがあるようです。

                  さて、どれを使うか.....