What are the "First Responder" and "Exit" boxes purpose in the storyboard editor?

16,420

Solution 1

I've never used it and probably never will but you can assign an object to be the first in line to receive the events from the UI.

I suppose you could be creating a UIView subclass and add it in to a UIViewController but you actually want some other object to receive and process the events other than the UIViewController you are adding it to.

I found this link which kind of explains it a bit better.

Solution 2

There are no good answer for this question, so I am posting my answer:

From here:

Note: You probably won’t be using the First Responder very much. This is a proxy object that refers to whatever object has first responder status at any given time. It was also present in your nibs and you probably never had a need to use it then either. As an example, you can hook up the Touch Up Inside event from a button to First Responder’s cut: selector. If at some point a text field has input focus then you can press that button to make the text field, which is now the first responder, cut its text to the pasteboard.

Edit:

1) First Responder is very useful if you are using text fields with keyboard notifications. I use it to make keyboard disappear, make an outlet to variable currentFirstResponder of your class, and in viewWillDisappear:

[self.currentFirstResponder resignFirstResponder];

2) You can read about unwind segues ("Exit" box) here

Solution 3

First Responder: The First Responder icon stands for the object that the user is currently interacting with. When a user works with an iOS application, multiple objects could potentially respond to the various gestures or keystrokes that the user creates. The first responder is the object currently in control and interacting with the user. A text field that the user is typing into, for example, would be the first responder until the user moves to another field or control.

Exit: The Exit icon serves a very specific purpose that will come into play only in multiscene applications. When you are creating an app that moves the user between a series of screens, the Exit icon provides a visual means of jumping back to a previous screen. If you have built five scenes that link from one to another and you want to quickly return to the first scene from the fifth, you’ll link from the fifth scene to the first scene’s Exit icon.

More here

Solution 4

You don't see this very often, where a deleted answer is actually correct, and the comment (likely influencing its deletion) on it is totally wrong! I'll try and improve on it.

Usually the IBAction you want to hook up to a button is in the view controller containing the button. However if the IBAction is in a different controller, e.g. a parent controller then drag from the button to the First Responder object and you are able to select the IBAction in the parent controller!

As the hidden answer states, how this is implemented is the action is sent to nil, which has the effect of the responder chain (i.e. view hierarchy) being searched for the action, as follows:

[UIApplication.sharedApplication sendAction:@selector(nextObject:) to:nil from:self forEvent:nil];

An example is a custom UITableViewCell. Add a UIButton to the cell but you want the action to go up to a View Controller that has an embed segue to a UITableViewController. Drag the touch up instead action to the First Responder and select the action in the container view controller. In the action to find the indexPath simply loop the visibleCells and check if the sender is isDescendantOfView:

- (IBAction)cellButtonTapped:(id)sender{
    for(UITableViewCell *cell in self.tableViewController.tableView.visibleCells){
        if([sender isDescendantOfView:cell]){
            NSIndexPath *indexPath = [self.tableViewController.tableView indexPathForCell:cell];
            NSLog(@"tapped %@", indexPath);
        }
    }
}

Another example could be a reload button: say your first view controller shows an downloaded item with an IBAction to reload it to get the latest data, then your child controller shows some detail, but you also want them to be able to reload the main item from within the detail, just add a button in the detail and drag its action to First Responder and select the reload IBAction in the parent controller. This allows you to hook up buttons to parent actions with no additional code like delegate methods!

For this to work the action needs to be in the responder chain hierarchy or it won't be found, you can read how the chain is built up in the docs. Also note if called from code the view needs to have appeared, viewWillAppear is too soon.

Share:
16,420
Madivad
Author by

Madivad

I stack therefore I exist

Updated on June 10, 2022

Comments

  • Madivad
    Madivad almost 2 years

    In the XCode IDE, at the bottom of the view controller in the MainStoryboard editor, are two boxes: First Responder, and Exit.

    I know what a firstResponder is programatically within the code, but in the storyboard editor, I can't seem to do anything useful by it.

    Am I able to use the first responder in this area to somehow set the first responder of the view? I'd like the first textfield to be active on load and I have tried right+click and dragging to no avail. I know I can set it programatically in the viewDidLoad method, but is there some way of doing it here?

    And what is the green Exit for?

    First Responder (orange) and Exit (Green) - what are they for?

  • Madivad
    Madivad over 11 years
    Thanks for the link, it does make it a little less muddy, but still rather murky. I can get the idea behind say: "shake to undo", or a menu item for cut/copy/paste, but still can't get in my head why you would want a nil target. ie wouldn't you know what you want undone? And/or would you want the viewController to handle it?
  • Yogesh Lolusare
    Yogesh Lolusare over 9 years
    Thanks for your honesty & quick solution from complete blog.
  • malhal
    malhal over 4 years
    Wrong sorry, First Responder icon means search up the responder chain for a view or view controller that can handle the action. You are confusing it with resigningFirstResponder on a text field.