この記事は前回の[Swift]カウントアップアプリを作ってSwiftを触ってみようの続きです。
#ソースコードはこちらから
https://github.com/techiro/CountUpAppForBeginners/tree/v1
#画面遷移で抑えておきたいポイント
- 画面遷移先のViewController
- ViewControllerとプログラムコードとの繋がり
- Segueという概念
#画面遷移先のViewController
画面遷移するために新しいViewControllerを追加
ボタンなどを追加したLibraryからViewController
を選択してドラッグ&ドロップ
![スクリーンショット_2020-08-05_11_20_23.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F8a05bf48-21f5-e55c-fd63-98299c2e9965.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7f390276ab554491eac1a90609ad6453)
![スクリーンショット_2020_08_07_23_41.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F0a40d9ec-b07b-eb88-93ad-6e24fe7d3e95.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2fa886b776831ec59f1bb1d5f4218860)
画面にViewControllerが追加されたらOK
#ViewControllerとプログラムコードとの繋がり
1.画面から新しいViewControllerを選択
![スクリーンショット 2020-08-08 0.20.51.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F3729c899-c3ba-3a16-c3ac-a83515d31ef5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e1b99fc0fc2435b36793c1398a2ba8e1)
2.Identity inspectorを選択
新しく追加したViewControllerのCustom Classが空になっている
このままだと画面遷移を行えないので、新しいClassを定義しなければならない。
##新しいClassを定義
画面左下の+ボタンをクリック→NewFileをクリック
Cocoa Touch Class
→Next
![スクリーンショット 2020-08-08 0.03.02.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F89cefcec-2575-ebeb-5713-28f435b9e80a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ee9818463520a7aff1a376740661de97)
###Class名NextViewController
に変更
![スクリーンショット 2020-08-08 0.04.21.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F41ab9864-8751-c800-bb4c-f4e5ede30bf0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a9b754e5341711c6384089365ad5858a)
###Subclass of: UIViewControllerに変更
この項目はClassがどんな用途で使われるかを設定でき、初期段階で必要なプログラムをXcodeが書いてくれます。
例えばここでUITableViewController
を選ぶとテーブルを使うためのコードを自動で入力してくれます。
###入力を終えたらNext
最後にファイルの保存場所を聞いてきます。
そのままCreate
を押してください
![スクリーンショット_2020_08_08_0_17.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2Fd2abfd2f-e8f1-7de7-3181-93608a7fba3a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e7363c7b1e63bf3360283eb80e364ef5)
##新しいViewControllerに新しいClassを紐づける
StoryBoardに戻って追加したViewControllerを選択
![スクリーンショット_2020-08-08_0_26_57.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F71a08087-ff7e-59e1-bcb3-414788c7b0df.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=17c44068ce12d8cb9dcb65d090f3a4b6)
これで新しいViewControllerに新しいClassを紐づけることができました!
##Segueという概念
Segueとは、storyboard上で画面遷移を表す部品です。
Segueは、画面遷移の方法と、どう画面遷移させるかを決めることができます。
###詳しく説明しているサイトを紹介
ボタンに対してSegueを作成することもできます。
例えば、「設定ボタンをタップしたら設定画面に遷移する。」を実現したい場合はノンコーディングで画面遷移を行うことができます。
今回使用する方法はViewControllerからSegueを作成してコーディングを行って画面遷移を実装します。
##Segueを作成
ViewControllerを選択→⌃(control)
+ ドラッグ&ドロップ
Manual SegueはPresent Modally
を選択
ViewControllerと新しいViewControllerがつながっていればOK
マークが違っていても画面遷移の見え方が変わるだけで、問題ないです。
##Segueに名前をつける
Segueを選択→Attribute inspector
→Identifire
→任意の名前をつける(今回はnext
)
##SegueのPresentationをFullScreenに変更(任意)
変更すると、画面全体にViewが表示されます。
##遷移先のViewControllerに戻るボタンを設置
NextViewController
に戻るボタンを新しく設置します.
Main.storyboard
→+ボタン
→Button
を選択してNextViewController
ドラッグ&ドロップ
それが完了したら、ボタンを選択してTitleをわかりやすい文字に変更してください。
##ボタンをNextViewController
クラスと紐づける
-
三マーク
をクリック→Assistantエディタを起動
StoryBoardとコードを一緒にみることができる
![Xcode_InterfaceBuilderKit_DocumentGearMenu.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2Fc241d881-e905-1e4a-d9e6-a643e01c4737.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f91cc791ceadec90285466fd9364878f)
- 戻るボタンをクリック→
⌃control
+ドラッグ&ドロップ
NextViewController
クラスにボタンを紐づける
###紐付けポイント
- Connection→Actionになっているか確認
![スクリーンショット_2020_08_08_14_04.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2Ff0405ef2-fda2-4bf7-5617-81124a879227.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b6184f0019b7e5a5d007f7674fa97329)
###下準備は終了。画面遷移のコードを書いていく
#画面遷移するためのコード
画面遷移をさせるためのコードはこれだけ
performSegue(withIdentifier: "next", sender: nil)
これを画面遷移させたい場所に書くだけで画面遷移します。
##試しにやってみる
前回の記事[初心者向け]カウントアップアプリを作ってSwiftを触ってみようでcountUpButton
を作成したので、
count
が2になったら画面遷移するようにコードを書いていきます。
@IBAction func countUpButton(_ sender: Any) {
//+ボタンを押すとラベルの文字をカウントアップ
count = count + 1
//画面遷移
if count == 2 {
performSegue(withIdentifier: "next", sender: nil)
count = 0
}
countLabel.text = String(count)
//カウントにあわせて文字の色を変更
changeColor()
}
⌘ + Rで実行
画面遷移できました🥳
#画面遷移から戻る方法
これもたった1行で完了します。
dismiss(animated: true, completion: nil)
これを画面遷移させたい場所に書くだけで画面遷移します。
##試しにやってみる
@IBAction func backButton(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
⌘ + Rで実行
###画面遷移から戻ることができました🥳
#画面遷移を行いながら値を渡す方法
画面遷移が無事終わったら、画面遷移を行う際に値も一緒に渡してみましょう!
今回は一般的に使われている方法を紹介します。
##NextViewController.swiftに値を渡すための準備
- 画面に値を表示するためのLabelを設置(+ボタンからUIパーツLabelを選択→
NextViewController.swift
と紐づける。) - ViewControllerから値をもらうための変数
passdata
を定義 - label.text = String(passdata)でLabelに値を反映
![スクリーンショット 2020-08-09 14.21.35.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240708%2F774ea764-5706-6bd1-782f-c98320403fd1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=80e2a1b8c68e10e79b69ae8ac4fc01c9)
@IBOutlet weak var label: UILabel!
var passdata = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
label.text = String(passdata)
}
##値を渡すためのメソッドを定義
prepare(for segue: UIStoryboardSegue, sender: Any?)
メソッドを定義
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//引数segueの中に画面遷移に関する情報が含まれている。
if segue.identifier == "next" {
//NextViewControllerに値を渡す処理を書く。
}
}
performSegue(withIdentifier: "ID", sender: nil)
で画面遷移を行うと自動的に、
prepare(for segue: UIStoryboardSegue, sender: Any?)
メソッドが呼ばれます。
これはSegueが実行されようとしていることをView Controllerに通知するメソッドです。
###このメソッドを使用して、新しいViewControllerに値を渡すことができます。
##注意点
このメソッドはSegueが実行されようとしていることを通知するので、複数のSegueから呼び出されます。
したがって、if segue.identifier == "next"{・・・}
のようにnext
のSegueからの情報かどうかを判定してから値を渡す処理を書く必要があります.
##メソッド内に処理を書く
@IBAction func countUpButton(_ sender: Any) {
//中略
//画面遷移
performSegue(withIdentifier: "next", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "next" {
let nextVC = segue.destination as! NextViewController
nextVC.passdata = count
}
##⌘ + R で実行
performSegue(withIdentifier: "next", sender: nil)
を実行した時のcount
の値を渡すことができました!
##今回やったこと
- 新しいViewControllerを作成して画面遷移を実装
- ViewControllerとプログラムコードとの繋がり
- Segueという概念の理解
以上でカウントアップアプリのチュートリアルは終わりです。
お疲れ様でした!
#もっと深掘りしたい方
この続きとして、
カウントアップアプリを改造して,通知をn秒後に通知を出してみる (n>0)
の記事も参考にしてみてください!
##最後に
最後までご覧いただきありがとうございます。
Twitterで主にSwiftについてのツイートをしているのでのぞいてみてください!
今回はSwiftの言語についてあまり詳しく説明しませんでしたが、
ここでもっと詳しい記事を書いているのでSwiftに興味が湧いた方は参考にしてみてください!