首页 > 解决方案 > Retrieving textFields data using userdefaults

问题描述

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.
}

} i edited the code please check it out.in viewDidApper Function..i got thread .... Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Users/madhu/Downloads/SegmentNAlertTask/SegmentNAlertTask/ViewController.swift, line 139

标签: swiftuserdefaults

解决方案


您正在崩溃,因为您正在nil从 UserDefaults 中检索一个值,或者因为有些东西不是 a[String]或不能被类型转换为 a [String]

在这段代码中:

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

你正在检索一个Any?对象。
也就是说,一个Optional可以持有或不持有值的对象。
另外,它是一个几乎可以是任何类的对象。

然后你强迫它变成一个[String],如果它不是一个[String]对象,它显然会崩溃。

你应该用这个替换那行代码:

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

这样,您将安全地解开检索到的对象并尝试将其类型转换为[String]. 如果它失败了,您data将不会nil使应用程序崩溃。

如果类型转换失败,您还可以提供默认值,如下所示:

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

如果类型转换失败,您将获得一个空数组[String]

TL;DR:我建议你研究Optionals一下以及如何与他们合作。


推荐阅读