前提・実現したいこと
TextFieldに入力された数字を別画面のLabelに表示する 事を実装してみたいのですが、
Labelに表示出来ても画面遷移をしてしまうと表示が消えてしまうので、UserDefaultsに保存して表示させたいです。
発生している問題・エラーメッセージ
TextFieldに入力された数をUserDefautlsに保存する という所までは作れたのですが、
UserDfautlsに保存されたTextFieldの入力内容をどうやってLabelに表示するのかが分からない状況です。
override func prepareで解決しないかも調べている状況です。
該当のソースコード
import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } }
import UIKit // 変数 var date = [String]() class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.keyboardType = UIKeyboardType.numberPad } @IBAction func okButton(_ sender: Any) { date.append(textField.text!) UserDefaults.standard.set(date, forKey: "numberDate") } }
試したこと
UserDefaultsを調べていて、色々試している状況です。
import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() label.text = date //Cannot assign value of type '[String]' to type 'String?' } }
UserDefautlsの基本やLabelに表示させる方法を調べているのですが、まだ実装出来ていません。
ご教示頂けると幸いです。
追記 2/16
色々調べているとoverride func prepareとoverride func viewWillAppear(_ animated: Bool)
が使えるのではと思い以下のコードを書きましたが、エラーが起きている状況です。
import UIKit class ViewController: UIViewController { var date:String? var dateBox = [String]() @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } // ViewControllerを表示する度に処理 override func viewWillAppear(_ animated: Bool) { dateBox.append(date!) //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value UserDefaults.standard.set(dateBox, forKey: "DateA") let defaults = UserDefaults.standard let set = defaults.string(forKey: "DateA") label.text = set } }
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.keyboardType = UIKeyboardType.numberPad } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "aSegue" { let ViewCon = segue.destination as! ViewController ViewCon.date = textField.text } } }
追記 2/16 ②
import UIKit class ViewController: UIViewController { var date:String = "" var dateBox = [String]() @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } // ViewControllerを表示する度に処理 override func viewWillAppear(_ animated: Bool) { dateBox.append(date) UserDefaults.standard.set(dateBox, forKey: "DateA") let defaults = UserDefaults.standard let set = defaults.string(forKey: "DateA") label.text = set } }
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.keyboardType = UIKeyboardType.numberPad } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "aSegue" { let ViewCon = segue.destination as! ViewController ViewCon.date = textField.text // Value of optional type 'String?' must be unwrapped to a value of type 'String' } } }
2/17 解決
import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let _ = UserDefaults.standard.object(forKey: "text") as? String { label.text = (UserDefaults.standard.object(forKey: "text") as! String) } } }
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } @IBAction func okButton(_ sender: Any) { UserDefaults.standard.set(textField.text, forKey: "text") } }
補足情報(FW/ツールのバージョンなど)
Swift4 Xcode10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/16 03:30
2019/02/16 13:18
2019/02/17 02:27