【iOS】iOSアプリ開発入門~ SwiftとUIの接続編２~

前回はボタンタップイベントを受けSwiftで処理をする方法について投稿しました。
SwiftとUIの接続編１：https://qiita.com/euJcIKfcqwnzDui/items/f794ee8b996e6d650027

今回は更にそのイベントを受けUIの表示を変更する方法について説明したいと思います。
とはいっても前回の内容とそれほど大きくな変わりません。

## UI自体とSwiftを接続する
UIの表示の変更すを指示するのはSwiftの役割です。
前回はUIからのイベントを接続しましたが今回はUI自体を接続します。

それではいつも通りプロジェクトを開いてください。
[前回](https://qiita.com/euJcIKfcqwnzDui/items/f794ee8b996e6d650027)説明したようにXcodeの画面を分割し、`Main.storyboard`と`ViewController.swift`をそれぞれ開きます。
<img width="1440" alt="スクリーンショット 2020-05-19 23.50.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/232fc2d9-683d-ab14-31fe-39d707e0e56e.png">

ボタンを接続してあげてもいいのですが、表示の変更なので今回はラベルを使ってあげましょう。
ラベルは何の変哲もないテキストを表示するためのUIです。
[レイアウト編１](https://qiita.com/euJcIKfcqwnzDui/items/ba37adae94e07c89d404#%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B)で説明した方法と同様にしてラベルをstoryboardに追加してください。
<img width="727" alt="スクリーンショット 2020-05-19 23.57.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/7e4000ad-3d3d-aa57-a985-e6584eeeffeb.png">

オートレイアウトで画面中央に配置してあげます。
(オートレイアウトの簡単な説明は[レイアウト編２](https://qiita.com/euJcIKfcqwnzDui/items/31f6b11afb317275f684#autolayout%E3%81%A8%E3%81%AF)でしていますので参考にしてください)
中央への配置の仕方は下図のように、ラベルに対して`Horizontally in Container`と`Vertically in Container`のそれぞれの制約に0を設定してあげ追加するとできます。
これらの制約は中央から水平・垂直方向からどれくらいの位置に配置するかという制約です。
<img width="319" alt="スクリーンショット 2020-05-20 0.00.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/bc002580-4902-d2e4-248f-fcba66b4a730.png">
このように制約が追加されていればOKです
<img width="606" alt="スクリーンショット 2020-05-20 0.05.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/6f5556bc-f368-590a-081b-0689ce0c2438.png">

ラベルを接続します。
[ボタンのイベントを接続した方法](https://qiita.com/euJcIKfcqwnzDui/items/f794ee8b996e6d650027#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)のようにcontrolを押しながら`ViewController.swift`にドラッグしてください。
場所は前回追加したtapButtonメソッドの上あたりにしましょう。

```swift:ViewController.swift
class ViewController: UIViewController {
    <<<< この辺に追加する。スペースがなくやり辛ければ改行してあげても構いません。
    @IBAction func tapButton(_ sender: Any) {
        print("Hello World")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
```

するとボタンのときと同様にポップアップが表示されます。
<img width="769" alt="スクリーンショット 2020-05-20 0.36.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/a955102b-abd3-0401-dfda-5de3f118379e.png">

ポップアップを以下のように変更し、[Connect]ボタンを選択します。

- Connection:Outlet
- Name:label
- Type:UILabel
- プルダウン:weak

<img width="288" alt="スクリーンショット 2020-05-20 0.50.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/07ee640f-316d-fc5a-6604-0ceb51b5a148.png">

ここで重要なのはConnectionに**Outlet**を指定することです。
ボタンイベントのときは**Action**を指定しましたが、UI自体を接続する場合はOutletの指定となります。
※今回のラベルではそもそもOutletかOutlet Collectionしか選べません。接続のされ方が若干違いますが両方UI自体を接続するものです。ラベルの機能は表示のみなのでActionはありません。

それぞれ簡単に説明します。とは言ってもボタンタップのイベントのときと大差ありません。

- Connection
    - **接続の種類**。Outlet or Outlet Collectionを選択するとUI自体を接続する。<br>基本はOutletを指定。Outlet Collectionを指定すると配列として扱える。
- Object
    - **接続先のオブジェクト**。View Controllerにラベルを接続するというイメージ。変更できない。
- Name
    - **プロパティの名前**。UIをコードに接続すると[プロパティ](https://qiita.com/euJcIKfcqwnzDui/items/f6e41f6b8f068c620ac6#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)と呼ばれる状態で接続される。<br>とりあえずは接続したラベルの名前と認識してもらえれば問題なし。
- Type:UILabel
    - **プロパティの型**。接続したラベルはUILabelという種類のUIです、というようなイメージ。
- プルダウン:weak
    - **参照の強さ**。少し難しい概念なのでとりあえずは気にせずOK。weakを選んでおけば間違いない。

以上がそれぞれの項目の内容です。

接続するとコードが自動的に追加されます。

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel! << ここが追加される
    @IBAction func tapButton(_ sender: Any) {
        print("Hello World")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
```

追加されたコードの頭には`@IBOutlet`とあります。これはInterface BuilderからOutletとして接続されるプロパティという意味です。

接続するとActionのときと同様に

では実際にコードと`@IBOutlet weak var label: UILabel!`の左側に●のようなマークが出ています。
ActionでもOutletでも接続されるとこのマークが表示されます。

storyboardを見てみます。
ラベルを選択し右クリックしてください。
[Referencing Outlets]に[label]、[View Controller]という項目が表示されています。
これはViewControllerに「label」という名前で接続されていますよ、という意味です。
<img width="602" alt="スクリーンショット 2020-05-20 1.17.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/4eb9cc03-e935-b7aa-c311-79de63c9d7b3.png">

これでUIとコードは接続は完了です！

## 表示を変更する
コードに接続したのでラベルの表示を変えてみましょう。

コードを以下のように編集してください。

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    @IBAction func tapButton(_ sender: Any) {
        self.label.text = "Hello World" // << ここを書き換える
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
```

シミュレータで実行します。
すると画面真ん中に「Label」と表示されたかと思います。
これが先程追加したラベルです。

ではボタンをタップしてください。
ラベルの文字列が変わり、「Hello World」と表示されます。
<img width="496" alt="スクリーンショット 2020-05-20 1.33.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/0607b7d1-70c0-fb3e-26ea-a84b9dcacc48.png">

わかったかも知れませんが、ボタンタップイベントのメソッドに<br>`self.label.text = "Hello World"`というラベルの表示する文字列を変更処理を書いたためです。

`self.label`は前項で追加したラベルのことです。
labelはUILabelという型でUILabelは`text`というプロパティを持っています。
このtextというプロパティが画面に表示する文字列で、ここを「Hello World」という文字列に書換えたため表示が変更されたというわけです。

このように接続したUIに対し様々な処理を行ってあげることでUIを変更することができます。

もう少し変更してみましょう。
UILabelはtextの他にも`textColor`というプロパティを持っています。
読んで字のごとく表示される文字の色です。
以下のように編集して赤色に変えてみます。

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    @IBAction func tapButton(_ sender: Any) {
        self.label.text = "Hello World"
        self.label.textColor = UIColor.red // 文字を赤にする
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
```

ボタンをタップすると赤文字で「Hellow World」に変更されました。

UILabelはもちろん`text`や`textColor`以外にも`backgroundColor`など数多くのプロパティを持っています。
ここでは全てを紹介しきれませんし私も全て把握できているわけではありません。
これらは[Apple Developerの公式ドキュメント](https://developer.apple.com/documentation/uikit/uilabel)に情報が載せられており、ここから変更したいプロパティや処理を調べて実装したりします。

また他にもXcodeから参照することもできます。(こっちの方がよくやる)
`@IBOutlet weak var label: UILabel`のUILabelの部分をcommandキーを押しながらクリックしてください。
ポップアップが表示されるので[Jump to Definition]をクリックしてください。UILabelの定義に飛びます。
<img width="402" alt="スクリーンショット 2020-05-20 2.03.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/1fa83994-bd53-e335-362d-cb68597b22d8.png">

定義ファイルを見てみると先程使った'text'と'textColor'があります。
<img width="642" alt="スクリーンショット 2020-05-20 2.06.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/82bf0bc2-3ec5-649f-e882-17b23eecf3d1.png">

ここにはUILabelで扱えるプロパティやメソッドが定義されています。
まずはこの定義ファイルを見て、それらしきものがあれば公式ドキュメントやその他のサイトで調べて実装するという流れになります。

## 最後に
今回はコードにUI自体を変更し表示の変更方法について説明しました。
だんだんとアプリらしくなってきたのではないでしょうか？
イベントではボタン、表示変更ではラベルを取り扱いましたがiOSのUIにはスイッチや少し扱いが難しいかも知れませんがスライダーなど数多くのUIが提供されています。
気になるUIがあれば自分で試してみて扱いに慣れていきましょう。

以上で本投稿は終わりです。
参考になった、わかりにくい、質問がある場合などはコメントを頂けると幸いです。

次回はSwiftで処理制御してもう少しアプリらしい振る舞いにしていきます。
SwiftとUIの接続編３:https://qiita.com/euJcIKfcqwnzDui/items/ac50ed99673e10f15b71

本連載ではプログラミング未経験からiOSアプリ開発が行えるようになることを目的としています。
今までの投稿をまとめていますのでこちらもご覧ください。
http://naoyalog.com/