View Controller Cannot Find Segue With Identifier - ios

I have 3 view controllers in a part of my storyboard. I also have 2 push segues, one switches the first view controller to the second one, and the other one switches the second view controller to the third one.
I perform both segues programmatically, and I have set all three view controllers to use the same custom class ( Called RegViewController ).
Everything works fine with the first segue, but the second one throws an exception saying
Crash: Receiver (<RegViewController: 0xab74b50>) has no segue with identifier 'a'
I set the identifier for second segue to "a" to make sure it is short and I'm not making any mistake.
Anyways, I'm sure that my view controller has a push segue with that identifier and I dunno if I'm making any mistake logically !
Any ideas ?

Found the problem :
Assigning 3 view controllers to same custom class, results in errors when you're trying to perform a segue, because the segue with desired identifier is not created from every view controller using that custom class. Using different custom classes would solve the problem.

check your segue identifier. because your segue identifier doesn't same in your code or you are declared identifier name different on your storyboard

Related

Multiple segues to one UIViewController

In my storyboard I have a TextInputViewController (subclass of UIViewController). I have multiples push segues leading to TextInputViewController with different identifiers from various view controllers. However every time one of these segues are called they seem to go to the same instance of TextInputViewController which causes a very strange behaviour.
Is there a way to make each segue create a different instance of TextInputViewController?
Segues always create a new instance of the destinationViewController (with the exception of the unwind segue which simply returns to a previously created viewController).
The behavior you are seeing must be caused by some other state external to the viewController since it is a new instance.
You can read more about using Segues here.

UINavigationController for infinite navigation (nested folders)

I need to navigate inside folders and files in directory (from server). The problem is that I don't know the number of folders so it's not possible to use performSegueWithIdentifier statically. How can I use navigation controller with dynamically number of view controllers in swift? I want to "push" a new view controller every time a user tap on a folder in order to list files/folders inside it and I want to do it with UINavigationController so the user have the possibility to go back with "previous" button.
Both storyboard and programmatically approaches are ok.
Thanks you
Storyboards and segues are just a crutch. Think about how you would do this without them. At each level, to go down a level, you would just instantiate a new view controller and push it onto the navigation controller stack with pushViewController:animated:.
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/#//apple_ref/occ/instm/UINavigationController/pushViewController:animated:
And in fact it takes only one view controller class to do this, since any instance can create and push another instance of its own class. The display of one folder is exactly like the display of any other.
So if you wanted to configure this notion in a storyboard, you would have a circular segue, that is, the view controller would have a push / show segue leading to itself.
I agree with #matt's answer, just create the controller and push it. For sake of completeness, you can do this in a Storyboard with a segue.
Here's how:
So that you can call the segue programmatically, add an additional prototype cell to your tableView. (You do this because you don't want the segue to be automatically triggered when the tableViewCell is selected. By using an additional prototype cell, the segue can be wired up, but it will never be triggered automatically since this prototype cell will never actually be instantiated.)
Control-drag from this prototype cell to the viewController icon at the top of the tableViewController. Select "Show" from the pop-up.
Find this segue in the Document Outline View and give it an identifier such as "showFolderSegue" in the Attributes Inspector.
Now, when you want to trigger the segue, call: self.performSegueWithIdentifier("showFolderSegue", sender: self)
You can use prepareForSegue to set up the new tableViewController as you normally would.
This method too works with a single tableViewController.

Segue in UICollectoinView using Xcode 6

I am new to Swift and iOS development.
I am trying to create a demo app which simply shows details of an item in a new scene when clicked.
I tried using Storyboard but I learned that One cannot create segues directly from cells in a storyboard because the CollectionView is populated dynamically through the data source.
So I tried using performSegueWithIdentifier:sender but clicking an item doesn't trigger anything. I have set the Identifier for the Segue in Storyboard. I can't figure out what's wrong (As I am pretty new and don't understand the complete flow yet).
My first class is myFirstViewController.swift and second is mySecondViewController.swift
Please help (Where should I put the prepareForSegue, performSegue function?)
I am using xCode 6 on OS X Yosemite.
Your myFirstViewController class must implement the UICollectionViewDelegate protocol.
In InterfaceBuilder create a segue to your second viewController by ctrl-dragging from the viewController1 icon to the second viewController. Give that segue an identifier name in the property inspector.
In myFirstViewController.swift, implement the collectionView(_:didSelectItemAtIndexPath:), there you can call performSegueWithIdentifier with your segue's identifier name.
You can segue directly from a cell in storyboard. Simply right-click and drag from the cell in the storyboard to the detail view controller that you want to activate.
If you really don't want to do it that way. Then another option would be to right-click and drag from your main view controller to the detail view controller to create a generic segue. Then name the segue. After that, you can call perform segue in your collectionView(collectionView, didSelectItemAtIndexPath) method. (Make sure you connect your view controller to your collection view as a delegate for this method to get called.)
Either way, you need to write a prepareForSegue(segue, sender) method in your main view controller to pass the selected item to the detail view controller.
Good luck on your new learning adventure!

Segue to a subclass of some view controller

I'm using a storyboard. Let's say I have a view controller that's named MYviewController.
In - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender; I would like to substitute the view controller that I'm segueing to, by one of its child, for example: MYviewControllerChild1 OR MYviewControllerChild2. The child that's segued to depends on the sender parameter.
These view controllers have the same scene (in the storyboard). Only their behaviour is slightly different.
I have a tableView that shows the user the settings of the application. When he clicks a cell, it segues to a viewController where he can modify the value of some setting. Some of theses are alphanumeric, others are numeric. Depending on which cell is clicked, I'd like the input viewController to format the value accordingly (if it's a decimal value I'll use a NSNumberFormatter for example).
Is that possible?
As mentioned in comments to your OP, I believe you should handle this kind of scenario in one viewcontroller.
However, if you insist on using separate controllers, maybe because you think the functionality will be expanded later down the line and therefore add more diversity, you need to handle this by creating multiple storyboard scenes - one for each child controller.
The destination view controller in prepareForSegue is imposed by the viewcontroller at the end of the segue in the storyboard. I don't think there is any way to override that.
As described, your problem isn't really a good candidate for a storyboard. If you use a storyboard you will have to create and sync multiple scenes. Several possible solutions::
Create multiple storyboard scenes and invoke them manually via performSegueWithIdentifier.
Use a nib file instead of a storyboard for this scene. You can use a single nib file since the view controller is created outside the storyboard with [[VCClass alloc] initWithNibFile: bundle: You can create the appropriate view controller class and pass the same nib file to all instances.
Use a single storyboard scene and view controller and pass in typing information in your prepareForSegue.

Custom View Controller display

I think this could be a simple question but I cannot seem to figure it out.
I have a screen which displays questions from an array. When the array has reached the end I want it to display another VC I have created. With all my other VC they are connected in the storyboard using segues between them. However, I only want this screen to display if I have reached the end of my array? Is what I am trying to doing making sense? Or does anyone know of any useful tutorials I could look at to figure it out for myself?
You can "manually" fire a seque with the performSegueWithIdentifier:sender: method using the segue identifier that you set on the segue in the storyboard. When you call that method the system sets up the right information and then executes prepareForSegue:sender: and then actually does the segue -- so the setup looks the same as an automatic segue trigger.
You can "manually" perform any segue with an identifier.
As to creating the segue to perform, you can create a segue from one View Controller to another in the storyboard (i.e. control-drag from the View Controller in the sidebar not from a button or a TableView cell or whatever). This sort of segue will have to be performed "manually".
Your call to do the "NextVCPlease" segue might look like:
if (lastQuestionDone) {
[self performSegueWithIdentifier:#"NextVCPlease" sender:whateverMakesSense]
}

Resources