質問: Int(textField.text!) else {」のところで「Use of unresolved identifier 'textField'」というエラーが出ました。
回答: > > 「guard let iB = Int(textField.text!) else {」のところで「Use of unresolved identifier 'textField'」というエラーが出ました。 > > > とありますが、該当するのは次の処理だと思います。 ``` @IBAction func torikesi(_ sender: Any) { guard let iB = Int(textField.text!) else { return } ``` ここで `textField` を参照していますが、この `textField` は `addViewController` で定義されておらず、`ViewController` で定義したものなので、直接見ることはできません。 方法はいくつかあるのですが(そのうちひとつは `ViewController` のインスタンスを直接参照する方法)、UserDefaults を使っているため、それで統一したいと思います。 考え方としては、 1. `ViewController` では追加したい値を入力し、その値を保存する 2. `addViewController` でこれまでの合計と前の画面で保存された値を呼び出し、足し算を行い表示 3. 新しい合計値を保存しなおす。 4. 「取り消し」ボタンが押された場合は、前画面で入力された値を合計から引き、新たに保存しなおす という流れが一つかと思います。 その流れでつくるとこのような感じになるかと思います。 ``` import UIKit // MARK: 削除 - グローバル変数として定義しない。また、変数名は何の目的かわかるようにする // 初期値を0に設定した変数aTextを作成 //var aText:Int = 0 class ViewController: UIViewController { @IBOutlet weak var label: UILabel! @IBOutlet weak var textField: UITextField! // MARK: 変更 - 合計値を入れる変数。ただし、ViewController では使わないので宣言する必要はない // var total = 0 override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // MARK: 下記の処理はUI部品に関する処理だが、 viewDidAppear(_:) は UI部品が表示された「後」の処理なので、できれば viewWillAppear(_:) に入れる let rgba = UIColor(red: 50/255.0, green: 150/255.0, blue: 1.0, alpha: 1.0)//rgbaを定義 label.backgroundColor = rgba // 背景色 label.textColor = UIColor.white // 文字色 label.layer.cornerRadius = 10.0 // 角丸のサイズ label.clipsToBounds = true // labelの時は必須(角丸) label.layer.borderWidth = 0.0 // 枠線の幅(0なので表示なし) label.layer.borderColor = UIColor.white.cgColor // 枠線の色 // MARK: 変更 - UserDefaults から指定されたキーで Int 型を取り出すのであれば、直接取り出す。 // ただし、ここでは合計値を直接使う必要性はないので取り出さない // total = UserDefaults.standard.integer(forKey: "合計") } @IBAction func addButton(_ sender: Any) { // iBにtextFieldに入力された数字を入れる guard let iB = Int(textField.text!) else { return } // MARK: 変更 - ここでは引き算しない // aTextにiBの数字を入れて、aTextに入れる。 // aText = aText + iB // UserDefaultsにaTextの値をtextKeyで保存する // MARK: 変更 - Int型なので Int型 として保存する // UserDefaults.standard.set(String(aText), forKey: "textKey") UserDefaults.standard.set(iB, forKey: "入力値") } } ``` ``` import UIKit class addViewController: UIViewController { @IBOutlet weak var label: UILabel! // MARK: 前画面での入力値 var addNum = 0 // MARK: これまでの合計 var total = 0 override func viewDidLoad() { super.viewDidLoad() // MARK: 追加 - これまでの合計と、ViewController で入力された値を取り出す // これまでの合計 // Int型で保存した値は Int 型として取り出す total = UserDefaults.standard.integer(forKey: "合計") // ViewController で入力された値 addNum = UserDefaults.standard.integer(forKey: "入力値") // 合計を計算し、ラベルに表示 total += addNum label.text = String(total) // アプリ再起動時に必要なのは合計値だけなので、合計値だけ改めて保存する UserDefaults.standard.set(total, forKey: "合計") } // ViewControllerを開く度に中の処理が呼ばれる override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // MARK: 削除 - UILabel に表示する処理は viewDidLoad に入れる(チラつき防止のため) } // MARK: 変更 - 取り消しの処理 @IBAction func torikesi(_ sender: Any) { // 合計から ViewController で入力された値を引く total -= addNum // ラベルを更新する label.text = String(total) // 合計を保存しなおす UserDefaults.standard.set(total, forKey: "合計") // 必要であれば、addNumをゼロクリアする // addNum = 0 } } ``` もちろん、このままでは色々と使いづらいところもありますが、そこは質問者さんが検討し変更すべき点だと思いますので、是非改良していただければと思います。