#はじめに
某プログラミング学習サイトでの学習記録を記します。
#共通操作
・範囲選択: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;
}
}