iPhoneアプリ学習：診断画面

#はじめに
某プログラミング学習サイトでの学習記録を記します。

#共通操作
・範囲選択：Shiftを押しながらクリック
・複数行コメントアウト：Command /

#No.1：プロジェクト作成
・Single View

#No.2：画面
・Main.storyboardを選択
・画面上の三つのアイコンの左端を選ぶ(ViewController)
・Editor > Embed In > Navigation Controllerを選択
　(Navigation Controllerは画面遷移に必要)
・View ControllerのNavigation itemのTitleに題名を入力する
・名前を入力するためのText Fieldとそれを送信するためのButtonを配置する

#No.3：結果表示画面の作成
・View Controllerからもう一つの画面を配置する
・Snedボタンのクリック時の遷移先に指定する
　・Sendボタンを選択しControlキーを押したままD&D
　・離すとき、SequeはShowを選ぶ(次の画面に遷移させる)
　・Segueに名前を付ける
　　・矢印を選択する
　　・Storyboard SegueのIdentifierに名前を入力する
・Navigation Itemから題名を入力する

#No.4：結果表示画面のViewControllerのクラスを作る
・File > New > File... > iOS > Cocoa Touch Class >
　Class       ：ResultViewController
　Subclass of :UIViewController
　CreateをクリックするとResultViewControllerが生成される。

・結果表示画面と、作成したResultViewControllerを関連付ける
　結果表示画面の上部の左端のアイコンをクリックする
　Navigationペイン > Custom Class > Classに「ResultViewController」
　と入力する。

#No.5：セグエを設定する
・TextFieldに入力された値をSegueを通じて次の画面に表示する
・一つ目の画面のViewController(左端の□)を選びAssitant Editorを開く
・TextFieldを選択し、Controlを押しながらViewController.SwiftにD&Dする。
・変数として扱う場合、ConnectionはOutletとする。
・ResultViewController.swift(自分で作成したファイル)に、textFieldの入力内容を受け取る変数を作成する。
　(例)var myName:String = ""
・再度ViewController.swiftを選択する
・prepeareメソッドを使用する(Segueで画面が遷移する前に実行される)
　(例) override func prepare(for segue:UIStoryboardSegue, sender: Any?) {
       // textFieldの中身をResultViewControllerのmyNameにセットする
　　　　// 変数宣言は、型スリオンを行う
       // 引数のsegue.destination：遷移先の画面を取得する
　　　　// 型をResultViewControllerに合わせるため型キャストする
　　　　let resultVC = segue.destination as! ResultViewController

　　　　// textはオプショナル型であるためtext!でunwrapする。
　　　　resultVC.myName = self.nameText.text!
　　　}

#No.6：遷移先の画面で値を受け取る
・func prepare()は、すべてのsegueによる遷移で実行される
・segueのidentifierで識別する必要がある
・(例)
　func(略) {
　　// segueのidentifierが設定されていなければreturn
　　guard let identifier = segue.identifier else {
　　　return
　　}

　　// segueのidentifierが指定の文字列の時だけ処理する
　　if identifier == "(自分で設定したidentifier)" {
　　　let (仮のcontroller名) = seue.destination as! (ViewController名)
　　
　　　// 遷移先の画面を取得する(型キャスト)
　　　resultVC.myName = self.nameText.text!
　　　　// 最後に!をつけてunwrapする
　　}

#No.7：結果表示
・配置したLabelに文字列を表示するために、Ctrl + D&Dでコードに接続する
　(例) @IBOutlet weak var (ラベル名)：UILabel!

・ランダムな数値を表示
　(ラベル名).text = Strig(arc4random_uniform(n);
　→ 0～ n-1までのランダムな数値を表示する

#No8：条件判定の結果次第で画面を遷移させない
・遷移元の画面の class ViewController : UIViewControllerに記述する
　override func shouldPerformSegue(略) {
　　if identifier == "showResult" {　　　　　// 指定のsegueであれば
　　　guard self.nameText.text != "" else {　// 遷移元のtextが空欄であれば
　　　　print("no name")　　　　　　　　　　　　// エラー文字列生成
　　　　return false　　　　　　　　　　　　　　// 遷移させない
　　　}
　　　return true;　　　　　　　　　　　　　　// textに何か入力されていればOK
　　} else {
　　　return true;　　　// 他の画面遷移であればOK
　　}
　}

#No.9：アラート表示

// segueによる遷移動作
override func shouldPerformSegue(略) {

　// 
　let alertCtrl = UIAlearController(title:"Error", message:"Enter string", preferredStyle: .alert)
　// タイトル：Error, メッセージ："Enter String", スタイル：.alert

　// ボタンを追加する
　let defaultAct = UIAlertAction(title, "OK", style: .default, handler:nil)
　　// ボタン名："OK", クリック時の動作：何もしない(nil)

　// alertCtrlとdefaultActを関連付ける
　alertCtrl.addAction(defaultAct);

// alertを表示させる
self.present(alertCtrl, animaed:true, completion:nil)// completion：終了時の動作。何もしないならnilでよい。

#No.10：画面遷移時にtextFieldをクリアする
class ViewController:UIViewController {
　(略)
　override func viewWillAppear(_ animated:Bool) {
　　// 戻地理のないメソッドをoverrideする時は、親クラスのメソッドを呼ぶ必要がある
　　super.viewWillAppear(animated)

　　self.nameText.text = "" // textFieldをクリア
　}

　(略)
}

#No.11：画面遷移前にキーボードを非表示にする
class ViewController:UIViewController {
　(略)
 override func prepare(略) {
　　if identifier == "(指定のsegueのidentifier)" {

　　　// textFieldを操作対象から外す → フォーカスを外す → キーボードが消える
　　　self.nameText.resignFistResponder()
　　}
　}
}

#No.12：delegate
・あるクラスの処理の実装を別のクラスに任せるための仕組み
　(例)textFieldの実装を、textFieldのクラスではなくViewControllerに書くことができる。

　// textFieldのUITextFieldDelegateプロトコルをViewControllerに適合させる
　class ViewController: UIViewController, UITextFieldDelegate {

　　override func UIViewDidLoad(略) {
　　　(略)
　　　// nameTextのdelegateプロパティで処理の記述箇所をこのクラスに指定する
　　　nameText.deleagate = self;
　　}

　　// キーボードのReturnキー押下時の動作を定義
 　func textFieldShouldReturn(_ textField: UITextField) -> Bool {
　　　// ボタンを押したときの処理
    　self.sendButton.sendActions(for: .touchUpInside)

　　　//真偽値
	// true  :returnキー押下時に既定の処理をする
	// false :returnキー押下時に処理を止める？
    　return true;
 　}
　}