17

On a UITextView to hide the keyboard, there is the method:

...
    textfield.returnKeyType = UIReturnKeyDone;
    textfield.delegate = self;
....

-(BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;

}

but if I want to leave the button "done" to the "return" and add a button to hide the keyboard, how do I?

Nilesh_iOSDev
  • 671
  • 4
  • 18
Vins
  • 1,814
  • 4
  • 24
  • 40

3 Answers3

38

You can assign a toolbar with a button that dismisses the keyboard as the text field's inputAccessoryView. A quick example would be,

UIBarButtonItem *barButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:textField action:@selector(resignFirstResponder)] autorelease];
UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
toolbar.items = [NSArray arrayWithObject:barButton];

textField.inputAccessoryView = toolbar;
CodeReaper
  • 5,988
  • 3
  • 35
  • 56
Deepak Danduprolu
  • 44,595
  • 12
  • 101
  • 105
9

Swift 2.0 version:

//Declared at top of view controller
var accessoryDoneButton: UIBarButtonItem!
let accessoryToolBar = UIToolbar(frame: CGRectMake(0,0,UIScreen.mainScreen().bounds.width, 44))
//Could also be an IBOutlet, I just happened to have it like this
let codeInput = UITextField()

//Configured in viewDidLoad()
self.accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(self.donePressed(_:)))
self.accessoryToolBar.items = [self.accessoryDoneButton]
self.codeInput.inputAccessoryView = self.accessoryToolBar

Swift 4:

//Declared at top of view controller
var accessoryDoneButton: UIBarButtonItem!
let accessoryToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
//Could also be an IBOutlet, I just happened to have it like this
let codeInput = UITextField()

//Configured in viewDidLoad()
self.accessoryDoneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.donePressed))
self.accessoryToolBar.items = [self.accessoryDoneButton]
self.codeInput.inputAccessoryView = self.accessoryToolBar

func donePressed() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

UIToolBar Documentation

'inputAccessoryView' documentation

Nil
  • 129
  • 4
  • 11
Jon Vogel
  • 5,244
  • 1
  • 39
  • 54
  • `donePressed` is just a function in your `UIViewController`. I usually resign the active keyboard of the first responder and then pop the view controller off the navigation stack if I so desire. – Jon Vogel Apr 17 '17 at 18:06
3

This can be done ways easier!

I made a custom view in IB, in my viewController.h I just made an IBOutlet UIView *accessoryView;, connected them and an - (IBAction)dismissKeyboard;

I put in the view a toolbar with a done button, made a connection to the IBAction an wrote: [textView resignFirstResponder] and

- (void)viewDidLoad
{
    textView.inputAccessoryView = accessoryView;
    [super viewDidLoad];
}

But actually that looks a bit strange and non-apple-style… Got an idea?

Julian F. Weinert
  • 7,474
  • 7
  • 59
  • 107