Prepare for Segue in Swift

IosSwiftUistoryboardUistoryboardsegue

Ios Problem Overview


I'm facing the error message:

"UIStoryboardSegue does not have a member named 'identifier'"

Here's the code causing the error

if (segue.identifier == "Load View") {
    // pass data to next view
}

On Obj-C it's fine using like this:

if ([segue.identifier isEqualToString:@"Load View"]) {
   // pass data to next view
}

What am I doing wrong?

Ios Solutions


Solution 1 - Ios

This seems to be due to a problem in the UITableViewController subclass template. It comes with a version of the prepareForSegue method that would require you to unwrap the segue.

Replace your current prepareForSegue function with:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "Load View") {
        // pass data to next view
    }
}

This version implicitly unwraps the parameters, so you should be fine.

Solution 2 - Ios

Swift 4, Swift 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "MySegueId" {
        if let nextViewController = segue.destination as? NextViewController {
                nextViewController.valueOfxyz = "XYZ" //Or pass any values
                nextViewController.valueOf123 = 123
        }
    }
}

Solution 3 - Ios

I think the problem is you have to use the ! to unbundle identifier

I have

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        if segue!.identifier == "Details" {
            let viewController:ViewController = segue!.destinationViewController as ViewController
            let indexPath = self.tableView.indexPathForSelectedRow()
            viewController.pinCode = self.exams[indexPath.row]
            
        }

    }

My understanding is that without the ! you just get a true or false value

Solution 4 - Ios

For Swift 2.3,swift3,and swift4:

Create a perform Segue at didSelectRowAtindexPath

For Ex:

   self.performSegue(withIdentifier: "uiView", sender: self)

After that Create a prepareforSegue function to catch the Destination segue and pass the value:

Ex:

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

       if segue.identifier == "uiView"{

        let destView = segue.destination as! WebViewController
        let indexpath = self.newsTableView.indexPathForSelectedRow
        let indexurl = tableDatalist[(indexpath?.row)!].link
        destView.UrlRec = indexurl
        
        //let url =
        
    }
    }

You need to create a variable named UrlRec in Destination ViewController

Solution 5 - Ios

Swift 1.2

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            if (segue.identifier == "ShowDeal") {
        
                if let viewController: DealLandingViewController = segue.destinationViewController as? DealLandingViewController {
                    viewController.dealEntry = deal
                }

            }
     }

Solution 6 - Ios

Prepare for Segue in Swift 4.2 and Swift 5.

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "OrderVC") {
        // pass data to next view
        let viewController = segue.destination as? MyOrderDetailsVC
        viewController!.OrderData = self.MyorderArray[selectedIndex]
        
       
    }
}

How to Call segue On specific Event(Like Button Click etc):

performSegue(withIdentifier: "OrderVC", sender: self)

Solution 7 - Ios

this is one of the ways you can use this function, it is when you want access a variable of another class and change the output based on that variable.

   override func prepare(for segue: UIStoryboardSegue, sender: Any?)  {
        let something = segue.destination as! someViewController
       something.aVariable = anotherVariable
   }
     

Solution 8 - Ios

Provided you aren't using the same destination view controller with different identifiers, the code can be more concise than the other solutions (and avoids the as! in some of the other answers):

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if let myViewController = segue.destinationController as? MyViewController { 
        // Set up the VC
    }
}

Solution 9 - Ios

Change the segue identifier in the right panel in the section with an id. icon to match the string you used in your conditional.

Solution 10 - Ios

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        if(segue!.identifier){
            var name = segue!.identifier;
            if (name.compare("Load View") == 0){
                
            }
        }
    }

You can't compare the the identifier with == you have to use the compare() method

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnikolausView Question on Stackoverflow
Solution 1 - IosCezarView Answer on Stackoverflow
Solution 2 - IosMohammad Zaid PathanView Answer on Stackoverflow
Solution 3 - IosRyan HeitnerView Answer on Stackoverflow
Solution 4 - IosSanduView Answer on Stackoverflow
Solution 5 - IosScott Byrns KCLView Answer on Stackoverflow
Solution 6 - IosM MurtezaView Answer on Stackoverflow
Solution 7 - Iosalex'sView Answer on Stackoverflow
Solution 8 - IosTaylorView Answer on Stackoverflow
Solution 9 - IosRamiro R. Alcaraz GarciaView Answer on Stackoverflow
Solution 10 - IosJakob HartmanView Answer on Stackoverflow