0

My situation consists of a UITable which when a row is selected it opens up a new VC and sends across a couple of variables.

My problem is that the segue is getting executed before the function DidSelectAtRow is run.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   print ("hello")
    self.selectedCellTitle = self.communities[indexPath.row]
    self.cellId = indexPath.row
    print ("now here: ", communityIds[cellId!])
   self.performSegue(withIdentifier: "showCommunitySegue", sender: self)
}

I know this because the print commands above are not being executed. The app then crashes out when the next screen because the variables it expected to be there (cellId) are null.

If I delete the segue in storyboard and run then all the debug outputs in that function run correctly. As soon as I create the segue again the app switches to the new screen and crashes before any of that above code is run.

To create my segue I am:

1) right clicking on the cell in my UITableView on VC1 within Storyboard and dragging to my VC2

2) selecting type as show

3) copying the segue identifier name from the prepare for segue function in VC 1, and pasting it into the identifier attribute in Storyboard for the new segue.

Any ideas?

Below is the full code for VC1:

import UIKit

class CommunitiesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


var selectedCellTitle: String?
var cellId: Int?
var communities = [String]() //{ didSet {     communitiesTableView.reloadData()
//     }
//  }
var communityIds = [String]()
var flag = true

var userEmailText: String?
var tempComId: Int?

@IBOutlet weak var joinCommunityButton: UIButton!
@IBOutlet weak var createCommunityButton: UIButton!


@IBOutlet weak var communitiesTableView: UITableView!

override func viewDidLoad() {


    self.communitiesTableView.delegate = self
    self.communitiesTableView.dataSource = self

    super.viewDidLoad()

}


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

    return self.communities.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
    cell.textLabel?.text = self.communities[indexPath.row]

    return cell

}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   print ("hello")
    self.selectedCellTitle = self.communities[indexPath.row]
    self.cellId = indexPath.row
    print ("now here: ", communityIds[cellId!])
   self.performSegue(withIdentifier: "showCommunitySegue", sender: self)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    if flag == true
    {

        self.communitiesTableView.reloadData()
        let myUrl = URL(string: "http://www.quasisquest.uk/KeepScore/getDetails.php?");
        var request = URLRequest(url:myUrl!);
        request.httpMethod = "POST";
        let postString = "email=\(self.userEmailText!)";

        request.httpBody = postString.data(using: String.Encoding.utf8);

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            DispatchQueue.main.async
                {

                    if error != nil {
                        print("error=\(error)")
                        return
                    }

                    do{
                        let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]

                        if let arr = json?["communities"] as? [[String:String]] {
                            self.communities = arr.flatMap { $0["name"]!}
                            self.communitiesTableView.reloadData()

                        }



                    } catch{
                        print(error)
                    }
            }
        }
        task.resume()
    }


}



override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{


    if segue.identifier == "createCommunitySegue" {
        let createCommunityController: CreateNewCommunity = segue.destination as! CreateNewCommunity
        createCommunityController.myEmail = self.userEmailText
    }

    if segue.identifier == "joinCommunitySegue" {
        let joinCommunityController: JoinCommunity = segue.destination as! JoinCommunity
        joinCommunityController.myEmail = self.userEmailText
    }

    if segue.identifier == "showCommunitySegue" {
       let showCommunityController: ShowCommunityViewController = segue.destination as!ShowCommunityViewController
        print("yes here: ", self.cellId!)
       showCommunityController.communityIsCalled = self.selectedCellTitle
       showCommunityController.comIds = self.communityIds
        showCommunityController.communityId = self.cellId


    }
}

}
RDowns
  • 651
  • 1
  • 10
  • 35

1 Answers1

0

You are creating your segue from Cell to ViewController, you need to create segue from ViewController to ViewController like this,

enter image description here

Rajat
  • 10,977
  • 3
  • 38
  • 55