RDowns RDowns - 11 days ago 6
iOS Question

Segue executing before DidSelectAtRow function

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


}
}

}

Answer

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

enter image description here

Comments