79

I am trying to make a mechanism to drill down a file / folder list. The idea is to show the same file list view controller every time the user selects a folder, and show a file detail view controller if he/she selects a file.

So far, I have created a segue from the file list view controller to the file detail view controller, and a segue from the file list table view cell to the the file list table view controller:

enter image description here

The issue with this is that as soon as the user taps the cell, the segue is executed. I would like to remove the segue from the table view cell and make one from the file list view controller to itself. That way, I could trigger the right segue programmatically when the user tapped the cell.

So, my question is: Is it possible to create a segue from a view controller to itself in Interface Builder?

Pang
  • 9,564
  • 146
  • 81
  • 122
Jorge
  • 2,530
  • 1
  • 19
  • 28
  • 1
    Yes, using xcode 5 you can. [see post](http://stackoverflow.com/questions/9226983/storyboard-segue-from-view-controller-to-itself/23436265#23436265). – John Henckel May 02 '14 at 20:20
  • Open the Editor menu, click `Show Document Outline`, then just right-button-drag from the cell to the Outline's File List`ViewController` object. – DawnSong Aug 21 '17 at 06:54

9 Answers9

43

If you are using a navigation controller you need to push the ViewController into the nav stack. In this example, i named my ViewController "VDI" in my Storyboard ID setting.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

If you don't want the NavigationController to keep adding itself into your "Back" history you can pop the stack before adding to it like so.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];
Jim True
  • 1,085
  • 12
  • 13
  • Both this one and @TJ/@Jorge methods will work. I've gone for this way because it feels cleaner. Benefits that I can see in the other method are that you can see your looping segues in the storyboard, and that you can handle all your navigation in "prepareForSegue:" – siburb Dec 17 '13 at 08:10
  • 1
    Worked perfectly! Also, that's the "Storyboard ID" in XCode that he set to "VDI," for those looking to recreate this. – Nerrolken Aug 21 '14 at 04:01
32

Using Xcode 5 there is a much simpler solution.

  1. Click the table cell in the storyboard
  2. Open the Connections Inspector (right arrow icon in the upper right)
  3. Under "triggered segues" you see "selection"
  4. Drag from the circle next to "selection" to the cell in the storyboard

That's it.

John Henckel
  • 10,274
  • 3
  • 79
  • 79
26

I developed a method to create a segue using a phantom button. I believe it will solve your problem. You can read about it in my answer here.

Community
  • 1
  • 1
T.J.
  • 3,942
  • 2
  • 32
  • 40
  • 4
    This put me on the right track. I added a button on the "Dock", and connected it to the file list view controller. Now I can perform the segue programmatically as I wanted. Thanks! – Jorge Feb 10 '12 at 23:50
  • 1
    I wish this weren't necessary just to get a self-segue, but this works. – jogloran Jul 22 '12 at 14:16
  • 2
    Mustafa's solution is less hacky and pretty straightforward. Making segues to same views with phantom buttons will only make your storyboard a mess. – strada Apr 09 '13 at 15:50
24

Instead of performing a segue to the same controller, you can instantiate a view controller (the same one) from storyboard, and then push that onto the navigation controller.

Mustafa
  • 5,307
  • 1
  • 20
  • 19
  • I like the phantom button solution better all my forward transitions go through prepareForSegue: instead of remember if a transition is created in IB or code. – Steve Moser Jul 10 '15 at 01:29
22

Interface Builder approach: Just segue to a storyboard reference which refers back to the presenting view controller.

Joshua C. Lerner
  • 1,910
  • 17
  • 12
18

The correct answer is to use a Storyboard Reference that is referencing the UIViewController you want to segue to itself and then point the segue at it.

enter image description here

Sethmr
  • 3,046
  • 1
  • 24
  • 42
12

In IOS 6, there is a cleaner solution than using a phantom button. You can still define the segue from the table cell to the view controller, and look at the sender to cancel the automatically triggered segue:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}
Community
  • 1
  • 1
Chris
  • 448
  • 5
  • 9
4

Here's how you can push another instance of the current view controller without defining a segue or hardcoding its own identifier:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

You just need to set the Restoration ID to be the same as Storyboard ID (there's a checkbox for that in IB).

Restoration ID

Tomas Andrle
  • 13,132
  • 15
  • 75
  • 92
0

Hope this helps.

I found that you can create multiple prototype cells.

Than you can link every cell (in the Storyboard) to a different View.

Something like this:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
Philipp Schlösser
  • 5,179
  • 2
  • 38
  • 52
Yari
  • 1