开发者

Hide Virtual Keyboard of UITextView when 'Done' Presses

开发者 https://www.devze.com 2023-02-14 06:44 出处:网络
I want to hide (resignFirstResponder) the virtual keyboard of UITextView when \'Done\' presses. Theres no \'Did End on Exit\' in UITextView. In UITextField i connect the \'Did End on Exit\' with an IB

I want to hide (resignFirstResponder) the virtual keyboard of UITextView when 'Done' presses. Theres no 'Did End on Exit' in UITextView. In UITextField i connect the 'Did End on Exit' with an IBActio开发者_StackOverflow中文版n and call resignFirstResponder method. How can i do this with UITextView?


The correct way to handle this is to add a done button in an inputAccessoryView to the UITextView. The inputAccessoryView is the bar that sometimes appears above the keyboard.

In order to implement the inputAccessoryView simply add this method (or a variation thereof) and call it in viewDidLoad.

- (void)addInputAccessoryViewForTextView:(UITextView *)textView{

//Create the toolbar for the inputAccessoryView
UIToolbar* toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
[toolbar sizeToFit];
toolbar.barStyle = UIBarStyleBlackTranslucent;

//Add the done button and set its target:action: to call the method returnTextView:
toolbar.items = [NSArray arrayWithObjects:[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                       [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(returnTextView:)],
                       nil];

//Set the inputAccessoryView
[textView setInputAccessoryView:toolbar];

}

Then handel the button being pressed by implementing the action method you called with resignFirstResponder.

- (void) returnBreakdown:(UIButton *)sender{

[self.textView resignFirstResponder];

}

This should result in a working "Done" button appearing in a standard toolbar above the keyboard.


I'm assuming by the "Done" button you mean the return key. It's not as intuitive as you might think. This question covers it pretty well.


you could add this to an action if you want to be able to use your return key [[self view] endEditing: YES];


Make sure you declare support for the UITextViewDelegate protocol.

@interface ...ViewController : UIViewController` in .h file.

In .m file, implement below method

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES; }


Here is the Swift version of the accessory "Done" button:

@IBOutlet weak var textView: UITextView!

// In viewDidLoad()

    let toolbar = UIToolbar()
    toolbar.bounds = CGRectMake(0, 0, 320, 50)
    toolbar.sizeToFit()
    toolbar.barStyle = UIBarStyle.Default
    toolbar.items = [
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil),
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: nil, action: "handleDone:")
    ]

    self.textView.inputAccessoryView = toolbar

// -----------------

func handleDone(sender:UIButton) {
    self.textView.resignFirstResponder()
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号