24時間でiosアプリ-twitterクライアント-の作成にチャレンジ
DESCRIPTION
第1回コデアルiOSアプリ勉強会-Programming24- スライド資料 http://engineer-intern.jp/archives/15923TRANSCRIPT
iOSのバージョン• iOS7とそれ以前http://www.idownloadblog.com/2013/06/14/ios-6-vs-ios-7-the-different-ui-views/(見た目の大きな変化)
• 今回はiOS7に限定
‣ iOS7動作機種
• iPhone4以降
• iPad 2以降、iPad mini全て
• iPod Touch 第5世代以降
フレームワーク• https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaFundamentals.pdf
2. 開発環境Xcodeを知る
• Apple社純正統合開発環境
• バージョンは最新(5.1)に(20140401現在)
• 新規作成時は「Single View Application」で
• 画面構成に早く慣れる
Xcode画面構成http://www.atmarkit.co.jp/ait/articles/1212/05/news022.html
• ツールバー
• ナビゲーターエリア
• エディタエリア
• ユーティリティエリア
• デバッグエリア
セグエで連結
• Buttonから次のView ControllerへControl + ドラッグ
• セグエの種類は「Push」
• 最初のView ControllerにNavigation ControllerをEmbed In
• もう一度Document Outlineを確認
Navigation Controller
• View Controllerの遷移を記録して管理
• 画面上部のNavigation Barに戻るボタンを自動生成
• Embed InしたView Controllerから記録開始
変数(プリミティブ)• 変数は値の入れ物
• 型で分類
int型(整数)
float型(実数)
BOOL型(1か0、YESかNO)他の言語と混乱した人向け →http://d.hatena.ne.jp/thata/20091123/1258950667
その他(文字型はオブジェクトの時に)
構文(if文)
• if文は条件分岐 int age = 20; // この数値を変えてみる if (age >= 20) { NSLog(@“成人"); // NSLog関数は後述 } else { NSLog(@"未成年"); }
構文(for文)• for文は繰り返し for (int i = 1; i <= 10; i++) { // 繰返し条件 NSLog(@"%d", i); // %dは整数を十進表示する書式 }
• if、forともに条件式に注意
条件式で「等しい」は「==」(比較演算子)http://www.objectivec-iphone.com/introduction/operator/logical-operator.html
• 構文は入れ子が可能(ifの中にif、など)
構文(switch文)• switch文は条件分岐(3分岐以上可) int era = 1; // この数値を変えてみる switch (era) { case 0: NSLog(@"昭和"); break; case 1: NSLog(@"平成"); break; default: NSLog(@"年号 error!”); // 大正生まれはどうする? break; }
関数• 引数を与えて戻り値を得る
• プログラミング言語では引数や戻り値がない場合がある→単なる処理の固まり
• f(x)=2x は int twice(int value) { return 2 * value; }
• この関数を呼び出す時は int x = 5; int answer = twice(x);
クラスの書き方• @interface
変数フィールド名、メソッド名の宣言部
• @implementation
メソッド実装部
• @interfaceは「.h」に書かれることが多い@implementationは「.m」に書かれることが多い
• ViewController.hとViewController.mを見てみよう
インスタンスの生成方法• allocしてinitする
• newする(上に同じ)
• allocしてからinitの代わりにinitWith~を使う (指定イニシャライザ)
• allocとinitWith~をまとめて行うメソッド (コンビニエンスコンストラクタ)を使う
• その他(この後出てくるクラスはほとんどこれ)
演習問題(Ex02)• 電卓の消費税ボタンCalciTaxクラスを作成
クラス税率taxフィールドを持つ
taxに値をセットするsetTaxメソッド持つ
taxの値を読み出すgetTaxメソッドを持つ
税込み計算を行うiTaxメソッドを持つ
• インスタンスを生成し、計算を実行する
Foundationフレームワーク• 基礎的なクラスをたくさん定義してある
NSNumberクラス
NSStringクラス
NSArrayとNSMutableArrayクラス
NSDictionaryとNSMutableDictionaryクラス
その他たくさん
NSArrayクラス(NSMutableArrayクラス)
• 配列オブジェクト(複数の要素を持つ)
• 要素はオブジェクトならなんでも良い
• オブジェクトだがalloc initしなくても初期化できる
• alloc initしても良い
• NSMutableArrayオブジェクトは要素の変更、追加、削除が可(NSArrayはそれらが不可、ということ)
NSDictionaryクラス (NSMutableDictionaryクラス)• 辞書オブジェクト(キーと値のセット)
• 要素はオブジェクトならなんでも良い
• オブジェクトだがalloc initしなくても初期化できる
• alloc initしても良い
• NSMutableDictionaryオブジェクトは要素の変更、追加、削除可(NSDictionaryはそれらが不可、ということ)
コレクションクラス• 複数の要素を持てるオブジェクトをコレクションと言う
NSArray
NSMutableArray
NSDictionary
NSMutableDictionary
その他
• for文との相性が良い @ITの記事がわかりやすい http://www.atmarkit.co.jp/ait/articles/0901/21/news126_2.html
• 特定要素の取り出し、要素の操作、追加削除変更など、メソッドを把握しておく
演習問題(Ex03)• 成績表を一覧表示するReportクラスを作成
学籍番号、氏名、成績フィールド
平均点を求めるメソッド
セッタメソッド、ゲッタメソッド
• 成績フィールドはNSDictionaryで持つ
数学、英語、国語キーの値を持つ
4. UIKitを知る• UI(ユーザインターフェース)の役割
情報の伝達
ユーザの誘導
総合的なユーザ体験
• UIで迷ったらAppleのドキュメントに立ち返る 「iOSヒューマンインターフェースガイドライン」 https://developer.apple.com/jp/devcenter/ios/library/documentation/userexperience/conceptual/mobilehig/BasicsPart/BasicsPart.html#//apple_ref/doc/uid/TP40006556-CH2-SW1
StoryboardでUI構築
• UI構築作業をStoryboardに任せる
• もう一度Object libraryでUIパーツを確認
• もう一度Attributes inspectorの項目を確認
ViewControllerグループ
• UIViewControllerクラス
• UINavigationControllerクラス
• UITableViewControllerクラス
• その他
UIパーツをStoryboardで生成
• xibファイルを作成してセルをカスタマイズ
UITableViewCellクラスのサブクラスを作成
xibファイルを同時に作成
xibファイルをGUIでカスタマイズ
Identifierを合わせる
UIKit重点項目• UIViewControllerクラス
ライフサイクル
Navigation Controllerによる管理遷移してきた画面(ViewController)を配列で記憶 pushで追加、popで取り出し(戻る)
• UITableViewControllerクラス
構成要素
代表的なメソッド
セルの生成方法
UIViewController• 各メソッドの呼び出されるタイミングhttp://d.hatena.ne.jp/glass-_-onion/20120405/1333611664など、良記事がたくさん
viewDidLoad
viewWillAppear:
viewWillDisappear:
prepareForSegue::
didReceiveMemoryWarning
UITableViewController• 各メソッドの機能http://blogios.stack3.net/archives/604 (UITableViewの解説)など、良記事あり
セクション数を返すメソッド
各セクションのセル数を返すメソッド
各セル表示の際に呼び出されるメソッド
各セルの高さを決定するメソッド
各セルのクリック時に呼び出されるメソッドなど
Twitter APIの利用方法• Twitter Developers “REST API v1.1 Resources”https://dev.twitter.com/docs/api/1.1
• リソースURLを指定してHTTP(S)でアクセス
• リソースURLとレスポンス例が掲載
• 用語に慣れが必要(「つぶやく」= statuses update など)
Twitter API
• 情報の要求はGETメソッド
• 情報の送信はPOSTメソッド
• レスポンスはJSONデータ
JSONデータをよく見て慣れておく
JSONデータはiOS側でNSDictionaryに変換「キー:値」のペア、入れ子構造など共通
dispatch_async()関数• 一般的な書式 dispatch_async(グローバルキューの取得, ^{ 重い処理「A」 dispatch_async(メインキューの取得, ^{ 重い処理完了後の処理「B」 )}; }); 重い処理の完了を待たずに実行する処理「C」
• 処理「A」と処理「C」は並行して実行される。
• 処理「A」が終了した時に処理「C」が重い処理をしている場合は、メインキューの取得待ちになる。
Twitter APIにおける並列処理
• SLRequestやNSJSONSerializationクラスの メソッドではブロックを利用( ^{ 処理 } )
• ブロック内の処理は並列で実行終了後GUI処理をする場合はメインキューを取得する必要あり
Twitter APIのレスポンス
• HTTPのステータスコードを調べる
200番台が成功
400番台はクライアントエラー
500番台はサーバエラー
• エラーの種類によってアプリのメッセージを変えるべき
本文中のURLからWebViewへ
• UITextViewのテキスト中のURLをクリック可能に
リンク先を表示するViewControllerを用意 (UIWebViewを持つWebViewControllerを 新規作成)
UIApplicationクラスのサブクラスを作成 (MyUIApplicationを新規作成)
openURLメソッドをオーバーライド
WebView関連の注意点• DetailViewController の textView の Detection は Links をチェック
• 同じく textView の Behavior は Editable のチェックを外す
• WebViewController の activityIndicator のBehavior は Hides When Stopped をチェック
• WebViewController の Storyboard ID を設定
ユーザインターフェースの調整
• Apple公式ドキュメント「ヒューマンインターフェースガイドライン」
• iOS7の目指すところ
• UIは脇役
• ユニバーサルデザイン
• アクセシビリティの考え方
エラー対応• どのエラーまで対応するか
• ユーザのエラー操作を未然に防ぐ
• 通信のエラー対応はしつこいくらいに
• ユーザ向けのメッセージ
• 開発者向けのメッセージ
• ユーザからのフィードバックを受け取る(永遠のベータ版?)
Gitコマンド基礎• まずはローカルから
じっくり取り組むならここ(宣伝)http://engineer-intern.jp/archives/11957
• 3つの段階を理解
ワーキングツリー
インデックス
リポジトリ
ローカルでGitコマンド• git config で初期設定
• git init でリポジトリ作成
取り消しは rm -r .git
• git status で状態確認
• ファイル作成(修正)でワーキングツリーへ(赤文字)取り消しはrm ファイル名(作成時)または git chekout --ファイル名(修正時)
ローカルでGitコマンド• git add でワーキングツリーからインデックスへ (緑文字)
取り消しはgit rm -- cached ファイル名(作成時)または git reset HEAD ファイル名(修正時)
• git commit でインデックスからリポジトリへ
取り消しはgit reset -- soft HEAD^(修正時のみ)
GitHubにアカウント作成
• ソーシャルコーディング
• 無料のアカウントはソースが常にさらされる(かえって勉強になる)
• 他の人のソースもじっくり見る
• git clone でリポジトリごとコピー
GitHubでのバージョン管理• リモートリポジトリ作成(New repositoryボタン)
じっくり取り組むならここ(宣伝)http://engineer-intern.jp/archives/12305
• 公開されることを覚悟して名前をつける
• 後々のことも考えて設定する
• git remote でリモートリポジトリの設定
• git push でリモートリポジトリにプッシュ
GitHubで分散バージョン管理• もう一人になり切って分散開発の疑似体験
• 2人目が git clone でリポジトリコピー
• git add、git commit 後 git push
• 1人目が git pull で2人目の修正取り込み
• わざとコンフリクト発生
• git pull、修正、git push でコンフリクト解消
ライトニングトークについて• 時間制限が厳しい
• 多くの発表を聴く人への優しさ
テンポの良さ
ウケるプレゼン増加傾向
• プレッシャーで発表者が成長
簡潔な箇条書きへシフト
「読ませる」より「見せる」
スライド1枚当たりの情報と説明時間を減らす