Search code examples
iosswift3uitableviewcell-arraydidselectrowatindexpath

Swift 3 pass the cell data A view to B view, with fun didSelectRowAt indexPath crash after select row


I want to pass the data A view to B view, it can build and show data in A view, but after I selected the cell, it crashed. And it shows the problem on the code.

vcTwo.selectedzones.zones = [selectedCity]

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

my code

The struct mode:

struct Location {
    var city: String!
    var zones = [String]()
}
var city = ["KHT", "TPAP", "TNNY"]

let kh = Location.init(city: "KHT", zones: ["sami", "zami", "zomi", "komi", "shini"])
let tpa = Location.init(city: "TPAP", zones: ["mid", "east", "anci", "zochi"])
let tnn = Location.init(city: "TNNY", zones: ["TN1","TN2", "TN3", "TN4", "TN5"])

Here is the A viewController code:

    import UIKit

class FirstViewTableViewController: UITableViewController {

   override func viewDidLoad() {
        super.viewDidLoad()
  }

   // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return city.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FirstCell

          cell.firstLabel.text = city[indexPath.row]

          return cell
    }



    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


        let selectedCity = city[indexPath.row]
        let vcTwo = self.storyboard?.instantiateViewController(withIdentifier: "secondVC") as! secondViewController
         vcTwo.selectedzones.zones = [selectedCity]

        self.navigationController?.pushViewController(vcTwo, animated: true)

    }
 }

The B viewController:

import UIKit

class secondViewController: UITableViewController {

    var selectedzones: Location!


    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return selectedzones.zones.count
    }

Is there any part wrong in the func didSelectRowAt indexPath?


Solution

  • here is the problem

         vcTwo.selectedzones.zones = [selectedCity]
    

    you need to init the selectedZone in first Controller

         let kh = Location.init(city: "KHT", zones: ["sami", "zami", "zomi", "komi", "shini"])
    
         vcTwo.selectedzones = kh