Change 'Return' button function to 'Done' in swift in UITextView

IosIphoneSwiftCocoa Touch

Ios Problem Overview


I would like to get rid of the "return" function of the keyboard while the user is typing, so there are no new lines, so instead I would like the 'return' key to function as 'Done' so it would hide the keyboard.

I am using a UITextView, that is editable, so the user is able to type their post, and post it to the main timeline, but since I have fixed cells, I don't want the user to be able to press 'return' and their post would be out of range of the timeline.

I found this that works with UITextField, but not with UITextView:

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    textField.resignFirstResponder()  //if desired
    return true
}

So I just wanted to know if there is a way to do that in a UITextView, or at least to be able to hide the keyboard if pressed return, instead of creating a new line.

Ios Solutions


Solution 1 - Ios

You can set the return key type of the text field:

textField.returnKeyType = UIReturnKeyType.done

Update You can definitely use the same approach to set the return key to "Done", as mentioned above. However, UITextView doesn't provide a callback when user hits the return key. As a workaround, you can try to handle the textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) delegate call, and dismiss the keyboard when you detect the input of a new line character:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if (text == "\n") {
        textView.resignFirstResponder()
    }
    return true
}

Solution 2 - Ios

I have tried many codes and finally this worked for me in Swift 3.0 Latest [April 2019] this achieved using UITextFields

The "ViewController" class should be inherited the "UITextFieldDelegate" for making this code working.

class ViewController: UIViewController,UITextFieldDelegate  

Add the Text field with the Proper Tag number and this tag number is used to take the control to appropriate text field based on incremental tag number assigned to it.

override func viewDidLoad() {

	userNameTextField.delegate = self
	userNameTextField.tag = 0
	userNameTextField.returnKeyType = .next
	passwordTextField.delegate = self
	passwordTextField.tag = 1
	passwordTextField.returnKeyType = .go
}

In the above code, the "returnKeyType = UIReturnKeyType.next" where will make the Key pad return key to display as "Next" you also have other options as "Join/Go" etc, based on your application change the values.

This "textFieldShouldReturn" is a method of UITextFieldDelegate controlled and here we have next field selection based on the Tag value incrementation.

func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
	if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
		nextField.becomeFirstResponder()
	} else {
		textField.resignFirstResponder()
		return true;
	}
	return false
}

Solution 3 - Ios

If you're working with a storyboard or xib, you can change the UITextView's Return button to 'Done' (or various other options) within Interface Builder, without the need for any setup code. Just look for this option in the Attributes inspector:

Return Key option in Interface Builder

From there, you just pair it up with the UITextViewDelegate code that others have already provided here.

Swift v5:

extension ExampleViewController: UITextViewDelegate {
    
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if (text == "\n") {
            textView.resignFirstResponder()
        }
        return true
    }
}

And then, in your viewDidLoad() method:

exampleTextView.delegate = self

Solution 4 - Ios

Working in Swift 4

Add this in viewDidLoad().

textField.returnKeyType = UIReturnKeyType.Done

Add this anywhere you like.

extension UITextView: UITextViewDelegate {
    public func textViewDidChange(_ textView: UITextView) {
        if text.last == "\n" { //Check if last char is newline
            text.removeLast() //Remove newline
            textView.resignFirstResponder() //Dismiss keyboard
        }
    }
}

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
QuestionBruno RecillasView Question on Stackoverflow
Solution 1 - IosutogariaView Answer on Stackoverflow
Solution 2 - IosBHUVANESH MOHANKUMARView Answer on Stackoverflow
Solution 3 - IosTheNeilView Answer on Stackoverflow
Solution 4 - IosErik NguyenView Answer on Stackoverflow