Получение данных textFields с использованием userdefaults - PullRequest
0 голосов
/ 12 февраля 2020

import UIKit

class ViewController: UIViewController {var data: [String] = [""]

    @IBOutlet weak var firstName      : TweeActiveTextField!
    @IBOutlet weak var lastName       : TweeActiveTextField!
    @IBOutlet weak var dateOfBirth    : TweeActiveTextField!
    @IBOutlet weak var EMail          : TweeActiveTextField!
    @IBOutlet weak var mobileNumber   : TweeActiveTextField!
    @IBOutlet weak var saveButton     : UIButton!


@IBAction func saveAction(_ sender: UIButton)
      {

          let alert = UIAlertController(title:"Sucessfully Saved", message:"Your Details Are Saved", preferredStyle: UIAlertController.Style.alert)
           var OKAction = UIAlertAction(title: "ok", style: UIAlertAction.Style.default)
           {
                             (OKAction) in
                             print("Ok Button Pressed")
           }
           present(alert,animated: true,completion: nil)
           alert.addAction(OKAction)


        var name = "\(firstName.text!)" + "\(lastName.text!)"


        button = UIButton()
          button.frame = CGRect(x: 210, y: yPosition, width: 150, height: 50)
          button.setTitle(name, for: UIControl.State.normal)
          button.backgroundColor = .cyan
          button.setTitleColor(.black, for: UIControl.State.normal)


          button.addTarget(self, action: #selector(mainAction), for: UIControl.Event.touchUpInside)

          textView.addSubview(button)
        yPosition += 70

      }
    @objc func mainAction()
      {
        let defaults = UserDefaults.standard
         data += ["\(firstName.text!) = \(firstName.text!)",
          "\(lastName.text!) = \(lastName.text!)",
      "\(EMail.text!) = \(EMail.text!)",
          "\(dateOfBirth.text!) = \(dateOfBirth.text!)",
          "\(mobileNumber.text!) = \(mobileNumber.text!)"]

          defaults.set(data, forKey: "savedData")
         // defaults.removeObject(forKey:"savedData")
          print(data)
    }


      override func viewDidAppear(_: Bool)
         {
          let defaults  = UserDefaults.standard
             data = defaults.object(forKey: "savedData") as! [String]
             print(data)
         }
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

} я отредактировал код, пожалуйста, проверьте его в функции viewDidApper. .i получил поток .... Неустранимая ошибка: неожиданно обнаружил ноль при развертывании необязательного значения: file /Users/madhu/Downloads/SegmentNAlertTask/SegmentNAlertTask/ViewController.swift, строка 139

1 Ответ

1 голос
/ 12 февраля 2020

Вы получаете cra * sh, потому что вы извлекаете значение nil из UserDefaults или потому, что есть что-то, что не является [String] или не может быть типизировано в [String].

В этом фрагменте кода:

data = defaults.object(forKey: "savedData") as! [String]

Вы извлекаете объект Any?.
То есть объект Optional, который может содержать или не содержать значение.
Кроме того, это объект, который может быть практически любым классом.

И тогда вы вынуждаете в [String], что, очевидно, приведет к sh, если это не [String] объект.

Вы должны заменить эту строку кода следующим образом:

data = defaults.object(forKey: "savedData") as? [String]

Таким образом, вы безопасно развернете извлеченный объект и попробуйте ввести его в [String]. Если произойдет сбой, ваш data будет nil вместо сбоя приложения.

Вы также можете указать значение по умолчанию в случае сбоя при типизации, например:

data = defaults.object(forKey: "savedData") as? [String] ?? []

Если При неудачной трансляции вы получите пустой массив [String].

TL; DR : я бы посоветовал вам изучить Optionals и узнать, как с ними работать.

...