60

更新:

我还尝试实现 UITextViewDelegate 委托,然后在我的控制器中执行:

- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    [textView resignFirstResponder];
    return YES;
}

我还将文本视图的委托设置为 self(控制器视图实例)。

单击完成按钮仍然只插入一个新行:(


更新:

到目前为止我所做的。我已经通过我的视图控制器实现了 UITextFieldDelegate。

我已经通过插座将文本视图连接到视图控制器。

然后我做了:


self.myTextView.delegate = self;

和:

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

但是当我点击完成按钮时,它只是添加了一个新行。

所以我的场景中有一个 UITextView 元素,当用户点击它时,会出现键盘并且可以对其进行编辑。

但是,我不能关闭键盘。

如何将完成按钮添加到键盘以便将其关闭?

4

9 回答 9

126

那很简单:)

[textField setReturnKeyType:UIReturnKeyDone];

为了解除键盘<UITextFieldDelegate>在你的类中实现协议,设置

textfield.delegate = self;

并使用

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textField resignFirstResponder];
}

或者

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
于 2012-04-09T17:33:05.303 回答
18

Go into your storyboard, select your text field and under the Attributes Inspector there is an option that says "return key"...select "Done".

Then go into your ViewController and add:

- (IBAction)dismissKeyboard:(id)sender;
{
    [textField becomeFirstResponder];
    [textField resignFirstResponder];
}

Then go back to your text field, click outlets and link "Did end on exit" to dismissKeyboard action.

于 2012-04-09T17:38:52.383 回答
17

将 UIToolBar 添加为自定义视图,其中将完成按钮作为 UIBarButtonItem。

这是将完成按钮添加到任何类型的键盘的更安全和更清洁的方式。创建 UIToolBar 并向其添加完成按钮并设置任何 UITextField 或 UITextView 的 inputAccessoryView。

UIToolbar *ViewForDoneButtonOnKeyboard = [[UIToolbar alloc] init];
[ViewForDoneButtonOnKeyboard sizeToFit];
UIBarButtonItem *btnDoneOnKeyboard = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                               style:UIBarButtonItemStyleBordered target:self
                                                              action:@selector(doneBtnFromKeyboardClicked:)];
[ViewForDoneButtonOnKeyboard setItems:[NSArray arrayWithObjects:btnDoneOnKeyboard, nil]];

myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard;

IBAction 完成按钮

 - (IBAction)doneBtnFromKeyboardClicked:(id)sender
  {
      NSLog(@"Done Button Clicked.");

      //Hide Keyboard by endEditing or Anything you want.
      [self.view endEditing:YES];
  }

斯威夫特 3

var ViewForDoneButtonOnKeyboard = UIToolbar()
ViewForDoneButtonOnKeyboard.sizeToFit()
var btnDoneOnKeyboard = UIBarButtonItem(title: "Done", style: .bordered, target: self, action: #selector(self.doneBtnFromKeyboardClicked))
ViewForDoneButtonOnKeyboard.items = [btnDoneOnKeyboard]
myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard

功能

  @IBAction func doneBtnFromKeyboardClicked (sender: Any) {
     print("Done Button Clicked.")
    //Hide Keyboard by endEditing or Anything you want.
    self.view.endEditing(true)
  }
于 2016-08-19T11:44:20.743 回答
11

Swift version:

In Your ViewController:

textField.returnKeyType = UIReturnKeyType.Done
textField.delegate = self

After your ViewController

extension MyViewController: UITextFieldDelegate {        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}
于 2015-10-06T20:43:27.150 回答
1

好的,所以我也一直在努力解决这个问题。目前我正在访问 UITableViewCell 中的 UITextView (通过标签)。因为我使用的是原型单元,所以我不能像每个人建议的那样使用 IBActions 或 IBOutlets。相反,我正在使用;

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)范围替换Text:(NSString *)text

然后,每次用户点击按钮时,这将为我提供文本。我当时的解决方案是获取换行符的 ascii 字符;“/n”。如果这是输入的文本,我会辞去第一响应者的职务。例如;

// If the text length is 0 then the user is deleting something, so only check the ascii character if there is text to check
if (text.length != 0) {
    // Get the Ascii character
    int asciiCode = [text characterAtIndex:0];
    // If the ascii code is /n or new line, then resign first responder
    if (asciiCode == 10) {
        [alertTextView resignFirstResponder];
        [DeviceTextView resignFirstResponder];
    }
}

不确定其他人是否需要这个 hacky 解决方案,但我想我会把它放在那里以防有人需要它!

于 2014-01-30T00:59:19.073 回答
1

在检查器中为您的文本字段设置'Return Key'选项下的选项。text field然后右键单击文本字段并按住CTRL选择'Did End On Exit'并将其拖动到您的view controllers文件中。这将创建一个IBAction方法。为方法命名,然后输入以下值:

[textField becomeFirstResponder];
[textField resignFirstResponder];

您的方法应如下所示:

- (IBAction)methodName:(id)sender;
{
    [sender becomeFirstResponder];
    [sender resignFirstResponder];
}
于 2013-04-04T11:40:16.717 回答
0

以下是我的方法,在Swift 3. 当doneBtn点击时,让它发送.editingDidEndOnExit事件。我使用此事件来处理多个文本字段之间的焦点问题。

// My customized UITextField
class MyTextField: UITextField {

    override func awakeFromNib() {
        super.awakeFromNib()

        // Add toolBar when keyboardType in this set. 
        let set : [UIKeyboardType] = [.numberPad, .phonePad]
        if (set.contains(self.keyboardType) ) {
            self.addDoneToolbar()
        }
    }

    // Add a toolbar with a `Done` button
    func addDoneToolbar() {

        let toolbar = UIToolbar()
        let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(onToolBarDone))

        toolbar.items = [space, doneBtn]
        toolbar.sizeToFit()

        self.inputAccessoryView = toolbar
    }

    @objc func onToolBarDone() {
        // I use `editingDidEndOnExit` to simulate the `Done` behavior 
        // on the original keyboard.
        self.sendActions(for: .editingDidEndOnExit)
    }
}
于 2018-01-25T06:28:30.983 回答
0

这是在键盘上添加完成按钮的最佳方式

textField.returnKeyType = UIReturnKeyDone;
于 2016-07-04T12:47:35.550 回答
-2

在 TextView 属性的 Interface Builder 中,您可以将返回按钮类型设置为 Done。

然后您需要检查何时按下 Return 按钮

  - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

检查 text == "/n" 是否然后通过在您的 textView 上退出第一响应者来关闭键盘。

于 2012-04-09T17:36:15.393 回答