【iphoneアプリ開発_初心者必見】値渡しの基礎・基本
最終更新日:2020年08月14日
家に引きこもっている「ゴルトン社長」です。(twitter : @GoRuton_1stStep)
人気の記事!
人生を変えたい人に向けて「はじめの一歩」を踏み出したい人にオススメ!
www.goruton.com www.goruton.com www.goruton.com www.goruton.com
値渡しの基礎・基本
コロナで中々外出できない中、家で作業することが増えている「ゴルトン社長」です。(https://twitter.com/GoRuton_1stStep)
あるViewControllerから別のViewControllerに,数字や文字列などを渡す方法を参考までに紹介します。
1) 値渡し
- ②のテキストフィールドに文字列を入れてボタンを押すことで,①のラベルにその文字列が表示される
- アプリを閉じても,文字列は保存される
①ViewController.swift
import UIKit class ViewController: UIViewController { @IBOutlet weak var buttona: UIButton! @IBOutlet weak var labell: UILabel! var receiveData: String? = " " override func viewDidLoad() { super.viewDidLoad() let ud = UserDefaults.standard //UserDefalutsクラス(アプリに値を保存したり,値を読み込んだりするときに使用するクラス) receiveData = ud.string(forKey: "HiScore") // 存在しない場合は空 labell.text = receiveData } }
②ataiController.swift
import UIKit class ataiController: UIViewController{ @IBOutlet weak var aaa: UITextField! var giveData: String = " " @IBAction func button(_ sender: Any) { self.performSegue(withIdentifier: "SegueA", sender: nil) } // 遷移先のViewControllerにデータを渡す関数 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "SegueA" { giveData = aaa.text! let vc = segue.destination as! ViewController vc.receiveData = giveData let ud = UserDefaults.standard //UserDefalutsクラス(アプリに値を保存したり,値を読み込んだりするときに使用するクラス) ud.set(giveData, forKey: "HiScore") //setで保存する } } }
2)様々な受け渡し方法の紹介
- 5パターン紹介
A)遷移先のビューコントローラのインスタンスを取得してプロパティにセット - part1 - part2 - part3 B)ローカルストレージを経由 C)遷移元のビューコントローラのインスタンスを取得
- 説明用アプリのコードと設定方法
ViewController.swift
import UIKit class ViewController: UIViewController { @IBOutlet weak var textField:UITextField! // for back @IBAction func goBack(_ segue:UIStoryboardSegue) {} //部品とは繋げない /* 1 ++++++++++++++ */ @IBAction func byInstantiateViewController(_ sender:UIButton) { let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController let _ = next?.view // ** hack code ** next?.textField1.text = textField.text self.present(next!,animated: true, completion: nil) } /* 2 ++++++++++++++ */ @IBAction func byInstantiateViewController2(_ sender:UIButton) { let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController self.present(next!,animated: true, completion: { () in next?.textField2.text = self.textField.text }) } /* 3 ++++++++++++++ */ /// セグエによる遷移 @IBAction func byPerformSegue(_ sender:UIButton) { performSegue(withIdentifier: "nextSegue", sender: nil) } /// セグエ実行前処理 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let next = segue.destination as? NextViewController let _ = next?.view next?.textField3.text = textField.text } /* 4 ++++++++++++++ */ @IBAction func byUserDefaults(_ sender:UIButton) { UserDefaults.standard.register(defaults: ["textField4":textField.text ?? ""]) UserDefaults.standard.set(textField.text,forKey:"textField4") UserDefaults.standard.synchronize() let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController self.present(next!,animated: true, completion: nil) } /* 5 ++++++++++++++ */ @IBAction func byPropertyAccess(_ sender:UIButton) { let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController self.present(next!,animated: true, completion: nil) } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.init(red: 230/255, green: 255/255, blue: 230/255, alpha: 90/100)//背景色の変更 // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
NextViewController.swift
import UIKit class NextViewController: UIViewController { @IBOutlet weak var textField1:UITextField! @IBOutlet weak var textField2:UITextField! @IBOutlet weak var textField3:UITextField! @IBOutlet weak var textField4:UITextField! @IBOutlet weak var textField5:UITextField! override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.cyan //背景色を空色に変更 } override func viewWillAppear(_ animated: Bool) { /// ローカルストレージ(UserDefaults)から値を取得 guard let obj = UserDefaults.standard.object(forKey: "textField4") else { return } textField4.text = obj as? String /// 遷移元ビューコントローラにアクセスして値をセット textField5.text = (presentingViewController as? ViewController)?.textField.text } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
説明文
A)遷移先のビューコントローラのインスタンスを取得してプロパティにセット
part1
ボタンを押した際に,instantiateViewController()にて遷移先ビューコントローラのインスタンスを取得してそのプロパティにアクセス。
let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController let _ = next?.view // ** hack code ** next?.textField1.text = textField.text self.present(next!,animated: true, completion: nil)
- let _ = next?.view はアウトレット変数(textField1)をインスタンスさせるためのハックコード
-ハックコード:
[Swift] アンダースコア (_) の使いどころ - SKIPBIT
part2
instantiateViewController()にて遷移先ビューコントローラのインスタンスを取得するとこまではpart1と同じ
let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController self.present(next!,animated: true, completion: { () in next?.textField2.text = self.textField.text })
- present()のコールバックブロックにてプロパティをセット
- ハックコードが不要
- テキストフィールドがチラつく感じがイケテない
part3
ボタン押下時,セグエ実行前に遷移先インスタンスを取得する方法
performSegue(withIdentifier: "nextSegue", sender: nil) /// セグエ実行前処理 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let next = segue.destination as? NextViewController let _ = next?.view next?.textField3.text = textField.text }
- performSegue()は内部にてprepare()をコールしますので,これをオーバーライド。
- アウトレット変数対策のハックコードが必要
B)ローカルストレージを経由
ボタン押下時。ローカルストレージに保存して遷移先でロードする方法。
UserDefaults.standard.register(defaults: ["textField4":textField.text ?? ""]) UserDefaults.standard.set(textField.text,forKey:"textField4") UserDefaults.standard.synchronize() let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController self.present(next!,animated: true, completion: nil) ========================================================== /// ローカルストレージ(UserDefaults)から値を取得 guard let obj = UserDefaults.standard.object(forKey: "textField4") else { return } textField4.text = obj as? String
C)遷移元のビューコントローラのインスタンスを取得
遷移先から遷移元ビューコントローラのインスタンスにアクセスする方法。
/// 遷移元ビューコントローラにアクセスして値をセット textField5.text = (presentingViewController as? ViewController)?.textField.text
- UIViewControllerのプロパティ、presentingViewControllerには遷移元ビューコントローラのインスタンスが格納されています.
- 格納タイミングはビュースタック構築後なので、viewDidLoad()内でアクセスしてもnilなので注意
3)背景色の変更方法
①)RGBを255で指定
②)カラーを指定
override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.init(red: 230/255, green: 255/255, blue: 230/255, alpha: 90/100)//背景色の変更① // self.view.backgroundColor = UIColor.cyan //背景色の変更② }
参考リンク
最後に!!
最後までご覧いただき、本当にありがとうございます!!
最近は、たくさんの読者さんから「コメント」や「メッセージ」が届くようになりました!!
皆さんと会話できて嬉しいですし、コメントで毎日励まされています。
ありがとうございます!
これからも、ゴルトン社長は「毎日」ブログを更新しています! www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com
皆さんから人気がある記事
www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com
まとめ記事
www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com