swift
1 2import UIKit 3import SwiftUI 4import Firebase 5 6class EditorViewController: UIViewController, UIColorPickerViewControllerDelegate, UITextFieldDelegate{ 7 8 @IBOutlet weak var textField: UITextField! 9 @IBOutlet weak var sav: UIButton! 10 @IBOutlet weak var tln: UITextField! 11 @IBOutlet weak var tfn: UITextField! 12 @IBOutlet weak var room: UITextField! 13 @IBOutlet weak var tani: UITextField! 14 @IBOutlet weak var save: UIButton! 15 @IBOutlet weak var re: UITextField! 16 @IBOutlet weak var tyu: UITextField! 17 @IBOutlet weak var shu: UITextField! 18 @IBOutlet weak var hi: UITextField! 19 var targetLabel: UILabel! 20 21 func getTextfield(view: UIView) -> [UITextField] { 22 23 var results = [UITextField]() 24 for subview in view.subviews as [UIView] { 25 if let textField = subview as? UITextField { 26 results += [textField] 27 } else { 28 results += getTextfield(view: subview) 29 } 30 } 31 return results 32 } 33 34 override func viewDidLayoutSubviews() { 35 super.viewDidLayoutSubviews() 36 37 let allTextFields = getTextfield(view: self.view) 38 for textField in allTextFields 39 { 40 textField.font = UIFont.boldSystemFont(ofSize: 20) 41 var widthOfText: CGFloat = textField.text!.size(withAttributes: [NSAttributedString.Key.font: textField.font!]).width 42 var widthOfFrame: CGFloat = textField.frame.size.width 43 while (widthOfFrame - 15) < widthOfText { // try here to find the value that fits your needs 44 let fontSize: CGFloat = textField.font!.pointSize 45 textField.font = textField.font?.withSize(CGFloat(fontSize - 0.5)) 46 widthOfText = (textField.text?.size(withAttributes: [NSAttributedString.Key.font: textField.font!]).width)! 47 widthOfFrame = textField.frame.size.width 48 } 49 } 50 } 51 52 override func viewDidLoad() { 53 super.viewDidLoad() 54 55 let userDefaults = UserDefaults.standard 56 userDefaults.string(forKey: "tlnl") 57 58 let defaults = UserDefaults.standard 59 let value = defaults.string(forKey: "tln") 60 tln.text = value 61 let valu = defaults.string(forKey: "textField") 62 textField.text = valu 63 let val = defaults.string(forKey: "tfn") 64 tfn.text = val 65 let va = defaults.string(forKey: "room") 66 room.text = va 67 68 save.layer.cornerRadius = 25 69 save.layer.borderWidth = 1 70 save.layer.borderColor = UIColor.lightGray.cgColor 71 72 self.title = self.targetLabel.text 73 74 let button = UIButton(frame: CGRect(x: 0, y: 0, width: 300, height: 44)) 75 self.view.addSubview(button) 76 button.translatesAutoresizingMaskIntoConstraints = false 77 button.heightAnchor.constraint(equalToConstant: 44).isActive = true 78 button.widthAnchor.constraint(equalToConstant: 130).isActive = true 79 80 button.topAnchor.constraint(equalTo: tyu.bottomAnchor, constant: 20.0).isActive = true 81 button.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -45).isActive = true 82 button.setTitleColor(UIColor.black, for: .normal) 83 button.layer.cornerRadius = 22 84 button.layer.borderWidth = 1 85 button.layer.borderColor = UIColor.lightGray.cgColor 86 button.setTitle("カラー選択", for: .normal) 87 button.center = view.center 88 button.addTarget(self, action: #selector(didTapSelectColor), for: .touchUpInside) 89 } 90 91 @objc private func didTapSelectColor() { 92 let colorPickerVC = UIColorPickerViewController() 93 colorPickerVC.delegate = self 94 present(colorPickerVC, animated: true) 95 96 } 97 98 func colorPickerViewControllerDidFinish(_ EditorViewController: UIColorPickerViewController) { 99 let color = EditorViewController.selectedColor 100 view.backgroundColor = color 101 } 102 103 @IBAction func back(_ sender: Any) { 104 self.view.window?.rootViewController?.dismiss(animated: true, completion: nil) 105 } 106 @IBAction func didTapApplyButton(_ sender: Any) { 107 108 let writtenText = tln.text! as String 109 let writtenTex = textField.text! as String 110 let writtenTe = tfn.text! as String 111 let writtenT = room.text! as String 112 113 if let tln = self.tln.text { 114 if let tfn = self.tfn.text { 115 if let room = self.room.text { 116 if let textField = self.textField.text { 117 self.targetLabel.text = textField + "\n" + tln + " " + tfn + "\n" + room 118 let defaults = UserDefaults.standard 119 defaults.set(writtenText, forKey: "tln") 120 defaults.set(writtenTex, forKey: "textField") 121 defaults.set(writtenTe, forKey: "tfn") 122 defaults.set(writtenT, forKey: "room") 123 124 view.endEditing(true) 125 } 126 } 127 } 128 129 } 130 131 132 133 self.navigationController?.popViewController(animated: true) 134 self.view.window?.rootViewController?.dismiss(animated: true, completion: nil) 135 } 136} 137 138```### 前提・実現したいこと 139 140ここに質問の内容を詳しく書いてください。 141 142初学者初投稿失礼いたします。 143 144現在時間割を入力できるようなアプリをswiftで作成しています。 14540こ程度のlabelを画面に貼り、ユーザーがタップした箇所のlabelを判断して項目の入力画面へ遷移、そこで入力した内容をlabelへ反映させるという方法で作成してまいりました。また、保存ボタンのタップでuser defaultによりデバイス内に保存できるような形式にしようとしました。 146しかしながら、label反映されたlabelの内容がアプリを落とすと消えてしまいます。そもそもデータの保存ができていないのでは?と思いましたが、項目入力画面に遷移させたところ項目は既に入力された状態で遷移先の画面が表示されます。 147また、label1をタップして項目を入力。次にlabel2をタップして項目を入力しようとすると画面遷移後の入力画面の項目にlabel1で入力した内容が入った状態で画面が表示されます。 148そのためlabel1の内容はlabel1にのみ反映、保存をさせ、次にlabel1をタップした際にはlabel1の内容が表示れるようにし、label2をタップした際にはlabel2の内容がしっかりと表示されるように保存させたいです。 149 150 151伝わりにくい文章で申し訳ないのですが、独学のため周りに頼れる人もおらず、ネットで検索してもヒットしないため力を貸していただけると幸いです。
Label は保存するためのものではありませんからね…。
言葉ではいまいち伝わりにくいので、markdown 機能を使ってコードを貼ってもらえると助かります。
https://teratail.com/help/question-tips#questionTips3-5-1
失礼いたしました。ご丁寧にありがとうございます!
正しくできているかわかりませんが、コード載せました。見づらくて申し訳ないです。
EditorViewController は時間割のマスをタップした時に呼ばれる入力画面で、時間割のタップした箇所の label が targetLabel ということでしょうか。なるほど、その発想はなかったです…。
まず、時間割全体のデータをどうやって保存するかを考える必要がありますね。とりあえず UserDefaults で頑張ることも可能ではありますが、データ構造をちゃんと考える必要があるでしょうね。
ところで、import Firebase してますが、データをクラウドに保存する予定でしょうか?
返信ありがとうございます。初心者が分からずひたすらに打ち込んだコードですので簡易化・簡略化できる方法がありましたらそちらでも結構です!
最初はfirebaseに保存した方がいいかと思ったのですが、テキストのみでデータ量も大きいものではないと判断してローカル保存に切り替えようと思っておりました。なのでimport Firebaseは消し忘れです。申し訳ありません。
あなたの回答
tips
プレビュー