iOSプログラミング クックブック

残念ながら、書籍を読んだだけでは、実用的なアプリを作れません。

書籍を読む目的は以下の通りで、実用的なアプリを作成するための準備に過ぎません。

  • Objective-Cの基本的な文法を覚える
  • Xcodeを中心とするツールの使い方を覚える
  • Apple社のドキュメントを読んだり、インターネットに溢れている情報を取捨選択したりするための、基本的な知識を身に付ける

また、書籍に書かれていることをすべて覚えることは不可能です。

そのため、アプリを作り始めると、以下のプロセスを何度も何度も繰り返すことになります。

  1. やりたいことのやり方が分からない、あるいは、思い通りに動作しない、という問題に直面する。
  2. Apple社のドキュメントを読んだり、書籍を読み返したり、インターネットで検索したりして、解決策を探す。
  3. 通常、解決策が複数見つかるので、実際に試すなどしてベストと思われる解決策を選択する。

結構単純な問題でもこのプロセスには時間がかかりますので、同じ問題に関して何度もこのプロセスを繰り返すのはバカバカしいです。そこで、弊社では、クックブックを作成し、問題が解決する度に、その解決策を追記するようにしています。ブックマークをまとめたり、Evernoteのようなアプリを利用したりする手もありますが、一遍のドキュメントとしてまとめておく方が良いと考えています。

社内用のドキュメントですが、私がこの先何年生きられるか分かりませんので、公開することとしました。

目次を以下に示しますので、内容をご確認の上、こちらから『iOSプログラミング クックブック [Kindle版]』をお求め頂けますと幸いです。

なお、iOS7、Xcode5に対応していますが、Storyboardは以下の理由から使っていません。

  • 複数人で開発する場合に適していない
  • Model-View-Controller(MVC)というデザインパターンに則って開発しようとする場合、Storyboardを使うと、ViewとControllerとの境目があいまいとなってしまう。

目次

  • 命名規則

    • 1. ファイル名の接尾辞
    • 2. 画像ファイル名(推奨)
    • 3. Product Name(推奨)
    • 4. Class Prefix(推奨)
    • 5. グローバルな名前(推奨)
    • 6. Prefix.pchで定義する定数(推奨)
  • Xcodeの操作

    • 1. Exception BreakPointの設定
    • 2. プロジェクトの作成
    • 3. プロジェクトの削除
    • 4. キーボード・ショートカットなど
    • 5. IBOutletの簡便な生成方法
    • 6. IBActionの簡便な生成方法
    • 7. Interface Builderでカスタムクラスを追加する
    • 8. あるViewに別のViewに対するAuto Layout Constraintを設定する
    • 9. プロジェクトに画像を追加する
    • 10. Frameworkの追加
    • 11. Auto Layoutで、あるViewの中に複数のViewを等間隔に配置する
    • 12. ブレークポイントでアボートさせる
    • 13. Internationalize
    • 14. UIViewControllerの追加
  • iOSプログラミング

    • 1. Convention(しきたり)一覧
    • 2. ローカル・ルール
    • 3. Global Constants
    • 4. テストモード
    • 5. #pragma mark
    • 6. Apple製のFrameworkのimport
    • 7. Property attributes
    • 8. Protocolは基本的にClass Extensionに記載する
    • 9. Private methodはclass extensionで宣言する必要はない
    • 10. プリミティブのみの構造体はstructを使う
    • 11. 型の変換
    • 12. 簡易記法

      • 12.1 コンパイラ・ディレクティブ@ を使用した簡易記法
      • 12.2 NSArrayやNSDictionaryの要素にアクセスする簡易記法
    • 13. NSStringリテラルの結合
    • 14. NSStringのチェック
    • 15. NSDictionaryにkeyがあるかどうかのチェック
    • 16. NSUserDefaultsの初期化
    • 17. NSArrayのproperty
    • 18. NSMutableArrayをfor-in loopで処理する場合の注意点
    • 19. 乱数
    • 20. 秒で表された時間を時:分:秒にフォーマットする
    • 21. Chronometer
    • 22. 短い音を鳴らす
    • 23. Thread-safe Singleton
    • 24. Status Barを表示しないようにする
    • 25. デバイスに固有のIDを取得する
    • 26. 言語コードの取得
    • 27. Localizable.stringsファイルの作り方
    • 28. 言語により語順が変わるString Format
    • 29. ImageをLocalizeする

      • 29.1 言語設定用のAsset Catalogを用意する
      • 29.2 言語ごとに画像を用意する
      • 29.3 XIBファイルでは、defaultの言語の画像を設定する
      • 29.4 ユーティリティ・ファンクションを用意する
      • 29.5 使用例
    • 30. UIViewのBackgroundをPattern ImageでTileする
    • 31. UIViewのBackgroundをImageでFillする
    • 32. UIButtonを画像で作る
    • 33. UITextFieldのReturnキー押下時の処理
    • 34. CheckBox
    • 35. Sliderをステップ状に変化させる
    • 36. CGImageを使う場合
    • 37. CGContextAddArcの角度の方向
    • 38. CのArrayを直接操作する
    • 39. UIViewのoriginをそのUIViewのheightだけ下に下げる
    • 40. 画面全体のデザインについて
    • 41. Auto Layoutについて
    • 42. UIViewControllerが表示される時に実施するアニメーションに関する注意点
    • 43. 縦横比を保存したまま拡大するアニメーション
    • 44. 一定秒後に処理を実施するブロック
    • 45. UIAlrertView
    • 46. UIAlertViewにパラメータを渡す
    • 47. Encoding URL Data(URLのパラメータを%エスケープする)
    • 48. HTTP POST
    • 49. JSON Encode
    • 50. UITableViewのHeaderをカスタマイズする
    • 51. UITableViewで、ある色のFooterを設定する
    • 52. UITableViewでセルの間に表示される白い線を表示させたくない
    • 53. UITableViewCellをクリックした時にHighlightされないようにする
    • 54. UITableViewを更新する
    • 55. UITableViewCellをカスタマイズする
    • 56. WebViewのUITableViewCell
    • 57. CollectionViewのUITableViewCell
    • 58. UITableViewCellの中にボタンを置く
    • 59. UICollectionViewを使う

      • 59.1 Interface Builder
      • 59.2 IBOutlet、Data Source、Delegateの設定
      • 59.3 Collection View Cellをデザインする
      • 59.4 CollectionViewControllerDataSourceプロトコル
    • 60. CollectionView内のitemが右から左にFlowするようにする
    • 61. Core Dataを使う

      • 61.1 Model Fileを作成する
      • 61.2 Entityを作成する
      • 61.3 EntityにAttributeを追加する

        • 61.3.1 CLLocationの扱い
      • 61.4 Entityに対応するクラスを作る
      • 61.5 NSManagedObjectModel、NSPersistentStoreCoordinate、NSManagedObjectContextを用意する
      • 61.6 Insert
      • 61.7 Fetch All
      • 61.8 Delete All
      • 61.9 Core Dataのデバッグ
    • 62. GPSを使用する

      • 62.1 CoreLocation Frameworkを追加する
        • 62.2 Info.plist

          • 62.2.1 UIRequiredDeviceCapabilities
          • 62.2.2 UIBackgroundMode
      • 62.3 コード例
    • 63. 地図を表示する

      • 63.1 MapKit Frameworkを追加する
      • 63.2 XIBファイル上の操作
      • 63.3 地図をある地点を中心とした所定の範囲にズームする
      • 63.4 MKPointAnnotationでカスタム画像を表示する
      • 63.5 Polygon Overlayを表示する
      • 63.6 Circle Overlayを表示する
      • 63.7 複雑なOverlayを表示する
    • 64. In-App Purchaseを使う

      • 64.1 Contracts, Tax, and Banking Information
      • 64.2 Explicit App ID
      • 64.3 Provisioning Profileを生成する
      • 64.4 Provisioning Profileを更新する
      • 64.5 テストユーザーの作成
      • 64.6 iTunes Connectにアプリのレコードを追加する
      • 64.7 In-App Purchase Productsの作成と登録
      • 64.8 StoreKit.frameworkを追加する
      • 64.9 Product IDのリストをApp Bundleに作成する
      • 64.10 TDBStoreManagerクラス(Singleton)を作る
      • 64.11 テストユーザーを使ってテストする
      • 64.12 In-App PurchasesのReview用のScreenshot
    • 65. iAdを使う

      • 65.1 Contracts, Tax, and Banking Information
      • 65.2 iAd Frameworkを追加する
      • 65.3 XIBファイル上の操作
      • 65.4 AdBannerViewDelegateを実装する
    • 66. アプリを実機で実行する

      • 66.1 Apple IDをXcodeのAccount preferencesに追加する
      • 66.2 iOSデバイスを開発用に登録する

        • 66.2.1 Team Provisioning Profileとは
      • 66.3 プロジェクトのTeamを設定する
      • 66.4 Private Keysをバックアップする
      • 66.5 アプリをデバイスで実行する
    • 67. リリース

      • 67.1 AppIcon
      • 67.2 Launch Image
      • 67.3 コードをリリースバージョンに変更
      • 67.4 テストとスクリーンショット
      • 67.5 iTunes Connectの情報の更新
      • 67.6 Distribution Certificateを生成する
      • 67.7 Store Provisioning Profileを生成する
      • 67.8 In-App Purchase ProductsをSubmitする
      • 67.9 アプリのStatus(状態)を「Waiting for Upload」に変更する
      • 67.10 Archiving and Validating
      • 67.11 アプリをSubmitする
    • 68 Rejectされた時の注意点
    • 69 Metadata Rejectedの場合の対応
  • トラブルシューティング

    • 1. ビルド時エラー

      • 1.1 WARNING: The Copy Bundle Resources build phase contains this target's Info.plist file
      • 1.2 Expected expression
      • 1.3 No visible @interface for 'NSDateFormatter' declares the selecter 'initWithDateFormat:allowNaturalLanguage:'
    • 2. 実行時エラー

      • 2.1 Expression is not assignable
      • 2.2 AutoLayout関連のエラーが出た時
      • 2.3 'Invalid type in JSON write (__NSDate)'
      • 2.4 [<TDBViewController 0x15d13280> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key progressView.
      • 2.5 The model used to open the store is imcompatible with the one used to create the store
      • 2.6 MKOverlayの一部のタイルが表示されない
      • 2.7 unrecognaized selector sent to instance …
      • 2.8 -[__NSArrayI addObject:]: unrecognized selector sent to instance
      • 2.9 NSUserDefaultsが更新されない
      • 2.10 WARNING: Slow defaults access for key ClientState took xx seconds, tolerance is 0.020000
      • 2.11 Development で、SKPaymentTransactionStateFailed error.localizedDescription:「iTunes Storeに接続できません」(Cannot connect to iTunes Store)
      • 2.12 for-in loop(__NSFastEnumerationMutationHandler)がクラッシュする
  • クイック・リファレンス

    • 1. 用語
    • 2. スクリーンサイズ
    • 3. Macの操作

      • 3.1 キーボード・ショートカット
      • 3.2 トラブル・シューティング

          3.2.1 頻繁にWi-Fiが切れる

    • 3. iPhoneの操作
    • 4. コードで使用する定数等

      • 4.1 String Format Specifiers
      • 4.2 Date Format Patterns
      • 4.3 System Sound ID
      • 4.4 UIViewContentMode
      • 4.5 UIModalTransitionStyle
      • 4.6 CGLineJoin
      • 4.7 UIViewAnimationOptions
      • 4.8 UITableViewCellSeparatorStyle
      • 4.9 CLLocationAccuracy
      • 4.10 MKOverlayLevel
  • 一般的な知識

    • 1. Nonzero-rule