LEKYSMA
LEKYSMA

Reputation: 141

Fatal error when trying to pass data to another view controller

In order to practice my networking, I built an app with a text field where you can input something. I use the wikipedia API to fetch the definition of that term / name/ expression. My goal is to then display that definition into another view controller.

A button performs the segue to the new view controller, where a label displays that definition.

The get request works, but when tapping the button, I get a fatalError : "Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value".

I would like to add that the error is displayed in the "prepare for segue" function.

Here is the code for my first view controller

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController {

    @IBOutlet weak var textEntryLabel: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    //MARK: - Relevant variables
    let wikipediaURl = "https://en.wikipedia.org/w/api.php"
    var termDefinitionInfo: String = ""
    let segueName: String = "toDefinition"

    @IBAction func buttonToDefinition(_ sender: UIButton) {
        // on fait la requete ici
        httpCall(termDefinition: textEntryLabel.text ?? "nothing to pass")

        performSegue(withIdentifier: segueName , sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == segueName {
            let secondVC = segue.destination as! DefinitionViewController

            secondVC.definitionLabel.text = termDefinitionInfo

        }
    }

    //MARK: - NETWORKING

      func httpCall(termDefinition: String) {
          let parameters : [String:String] = [
                 "format" : "json",
                 "action" : "query",
                 "prop" : "extracts",
                 "exintro" : "",
                 "explaintext" : "",
                 "titles" : termDefinition,
                 "indexpageids" : "",
                 "redirects" : "1",
                 ]

          //
          request(wikipediaURl, method: .get, parameters: parameters).responseJSON { (response) in
              if response.result.isSuccess {
                //1. on affiche le tableau json initial
                let definitionJSON: JSON = JSON(response.result.value)
                print(definitionJSON)

                // deux valeurs : pageID et definition
                let pageId = definitionJSON["query"]["pageids"][0].stringValue
                let pageDefinition = definitionJSON["query"]["pages"][pageId]["extract"].stringValue
                self.termDefinitionInfo = pageDefinition
                print(self.termDefinitionInfo)

              } else {
                print("Error! Could not fetch data!")
            }
          }
      }


}

Here is the code for the second view controller

import SwiftyJSON
import Alamofire

class DefinitionViewController: UIViewController {

    @IBOutlet weak var definitionLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


}```

Upvotes: 1

Views: 250

Answers (1)

Maysam
Maysam

Reputation: 7367

Tip: Try to avoid force down casting

In your case you are trying to assign a value to an IBOutlet when it's not wired to its parent view controller. You better do this:

class DefinitionViewController: UIViewController {
    @IBOutlet weak var definitionLabel: UILabel!
    var labelValue: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        definitionLabel.text = labelValue
    }
}

And in your first view:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == segueName {
        if let secondVC = segue.destination as? DefinitionViewController {
          secondVC.labelValue = termDefinitionInfo
        }
    }
}

Upvotes: 3

Related Questions