LoginSignup
0
2

More than 3 years have passed since last update.

iPhoneアプリ学習:診断画面

Last updated at Posted at 2020-06-23

はじめに

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

共通操作

・範囲選択: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;
 }
 }

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2