【第３回】Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Work with View Controllers 編）

# はじめに

AppleのSwiftアプリ開発チュートリアルを進めていて出てきた関数やクラスなどについて、調べたことを残していきます。
チュートリアルを進めながら、**ざっくりと**どういうものかを把握するためのお供になればと思います。

初学者のため、間違い等あればご指摘ください。 :bow: 

第１回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Build a Basic UI 編）](http://qiita.com/taji-taji/items/9202d944bf403957a22e)
第２回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Connect the UI to Code 編）](http://qiita.com/taji-taji/items/da3b800914fa3313d5a8)
第３回：Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Work with View Controllers 編）←今回はここ
第４回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Implement a Custom Control 編）](http://qiita.com/taji-taji/items/1ca474a4c2d2b4d779db)
第５回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Define Your Data Model 編）](http://qiita.com/taji-taji/items/2f2c4367752a839e8fb7)

# チュートリアルページ
https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson2.html#//apple_ref/doc/uid/TP40015214-CH5-SW1

以下のような構成でレッスンが進んでいくので、それに沿って進めていきます。

- Building the UI
 - Build a Basic UI
 - Connect the UI to Code
 - **Work with View Controllers**（今回はここ）
 - Implement a Custom Control
 - Define Your Data Model
- Working with Table Views
 - Create a Table View
 - Implement Navigation
 - Implement Edit and Delete Behavior
 - Persist Data


# Work with View Controllers

今回は以下のレッスンで出てきたものについて見ていきます。

https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson4.html#//apple_ref/doc/uid/TP40015214-CH6-SW1


## ■ UIImageView

画面上での画像の表示を管理するクラス。
単一の画像の表示や複数画像を用いたアニメーションを行う機能もある。


### チュートリアルでの使用例

```swift:ViewController.swift
@IBOutlet weak var photoImageView: UIImageView!
```

### ドキュメント

- 公式
[UIImageView Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImageView_Class/)

- 参考
http://iphone-tora.sakura.ne.jp/uiimageview.html


## ■ UITapGestureRecognizer

UIGestureRecogniterのサブクラスでタップを認識する。

numberOfTapsRequiredプロパティで認識するタップの回数、
numberOfTouchesRequiredプロパティでタップする指の本数を指定する。


### チュートリアルでの使用例

```swift:ViewController.swift
    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) {
```

### ドキュメント

- 公式
[UITapGestureRecognizer Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITapGestureRecognizer_Class/)

- 参考
https://akira-watson.com/iphone/uigesturerecognizer.html


## ■ UIImagePickerController

画像や動画の選択または撮影を行う際に用いるクラス。

後述の`UIImagePickerControllerDelegate`と`UIImagePickerControllerDelegate`の採用が必要。


### チュートリアルでの使用例

```swift:ViewController.swift
// UIImagePickerController is a view controller that lets a user pick media from their photo library.
let imagePickerController = UIImagePickerController()
```

### ドキュメント

- 公式  
[UIImagePickerController Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerController_Class/)


## ■ UIImagePickerControllerDelegate

フォトライブラリーから画像を選択する等、イメージピッカーを使用する際に必要なメソッドが定義されたプロトコル。

チュートリアルでは、`UIImagePickerController`を使用してフォトライブラリーから画像を選択するため、このプロトコルを実装する必要がある。

### チュートリアルでの使用例

```swift:ViewController.swift
class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
```

### ドキュメント

- 公式  
[UIImagePickerControllerDelegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerControllerDelegate_Protocol/)


## ■ UINavigationControllerDelegate

画面遷移を管理する`UINavigationController`を使用する際に必要なプロトコル。

チュートリアルでは、`UINavigationController`のサブクラスである`UIImagePickerController`を使用するため、このプロトコルを実装する必要がある。

### チュートリアルでの使用例

```swift:ViewController.swift
class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
```

### ドキュメント

- 公式  
[UINavigationControllerDelegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UINavigationControllerDelegate_Protocol/)


## ■ UIImagePickerControllerSourceType

画像をどこから取得するかを指定できる。

列挙型で宣言されており、

- PhotoLibrary（フォトライブラリ）
- Camera（カメラを起動して撮影したもの）
- SavedPhotosAlbum（カメラロールアルバム）

から選択可能。

`UIImagePickerController`では`sourceType`プロパティとして定義されている。


### チュートリアルでの使用例

```swift:ViewController.swift
// Only allow photos to be picked, not taken.
imagePickerController.sourceType = .PhotoLibrary
```

### ドキュメント

- 公式  
[UIImagePickerControllerSourceType - UIImagePickerController Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerController_Class/#//apple_ref/c/tdef/UIImagePickerControllerSourceType)


## ■ presentViewController

`UIViewController`のメソッド。
指定したビューコントローラをモーダルで表示する。

チュートリアルでは、`imagePickerController`を指定してフォトライブラリを表示させている。


### チュートリアルでの使用例

```swift:ViewController.swift
presentViewController(imagePickerController, animated: true, completion: nil)
```

### ドキュメント

- 公式  
[presentViewController(_:animated:completion:) - UIViewController Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/presentViewController:animated:completion:)


## ■ imagePickerControllerDidCancel

`UIImagePickerControllerDelegate`プロトコルによって定義されており、実装する必要があるメソッド。
呼び出したイメージピッカービューでユーザがキャンセルをした時に呼ばれる。

この中で`dismissModalViewControllerAnimated`メソッドを実装してイメージピッカーの表示を表示をなくす。


### チュートリアルでの使用例

```swift:ViewController.swift
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    // Dismiss the picker if the user canceled.
    dismissViewControllerAnimated(true, completion: nil)
}
```

### ドキュメント

- 公式  
[imagePickerControllerDidCancel(_:) - UIImagePickerControllerDelegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerControllerDelegate_Protocol/#//apple_ref/occ/intfm/UIImagePickerControllerDelegate/imagePickerControllerDidCancel:)


## ■ dismissViewControllerAnimated

モーダルで表示されているビューコントローラを閉じる。


### チュートリアルでの使用例

```swift:ViewController.swift
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    // Dismiss the picker if the user canceled.
    dismissViewControllerAnimated(true, completion: nil)
}
```

### ドキュメント

- 公式  
[dismissViewControllerAnimated(_:completion:) - UIViewController Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/dismissViewControllerAnimated:completion:)


## ■ imagePickerController

`UIImagePickerControllerDelegate`プロトコルによって定義されており、実装する必要があるメソッド。
画像が選択された時に呼ばれるメソッドで、選択された画像に何か処理をする際にここに実装する。

### チュートリアルでの使用例

```swift:ViewController.swift
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    // The info dictionary contains multiple representations of the image, and this uses the original.
    let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    
    // Set photoImageView to display the selected image.
    photoImageView.image = selectedImage
    
    // Dismiss the picker.
    dismissViewControllerAnimated(true, completion: nil)
}
```

### ドキュメント

- 公式  
[imagePickerController(_:didFinishPickingMediaWithInfo:) - UIImagePickerControllerDelegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerControllerDelegate_Protocol/#//apple_ref/occ/intfm/UIImagePickerControllerDelegate/imagePickerController:didFinishPickingMediaWithInfo:)


---



# 参考サイト
http://iphone-tora.sakura.ne.jp/uiimageview.html
https://akira-watson.com/iphone/uigesturerecognizer.html


# 次のレッスン
第４回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Implement a Custom Control 編）](http://qiita.com/taji-taji/items/1ca474a4c2d2b4d779db)