如何将“完成”按钮添加到键盘?

How to add Done button to the keyboard?

提问人:Richard Knop 提问时间:4/10/2012 最后编辑:GingerHeadRichard Knop 更新时间:5/19/2023 访问量:106430

问:

更新:

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

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

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

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


更新:

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

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

然后我做了:


self.myTextView.delegate = self;

和:

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

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

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

但是,我不能关闭键盘。

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

iOS iPhone Objective-C Xcode 编程创建的

评论

0赞 Richard Knop 4/10/2012
@joerick我试过你的链接。当我单击“完成”按钮时,它只是插入一个新行。
0赞 joerick 4/10/2012
向我们展示您到目前为止所拥有的;发布您当前使用的代码,然后我们可以看到您可能做错了什么。
0赞 Richard Knop 4/10/2012
@joerick 查看我的最新更新(在我的帖子顶部)。我已经尝试了所有方法,您的链接(以及其他链接)以及此页面上发布的所有答案。单击“完成”仍然只是添加一个新行:(

答:

128赞 Sebastian Flückiger 4/10/2012 #1

这很简单:)

[textField setReturnKeyType:UIReturnKeyDone];

要关闭键盘,请在类中实现协议,请设置<UITextFieldDelegate>

textfield.delegate = self;

并使用

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

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

评论

0赞 Richard Knop 4/10/2012
我做了所有这些,单击“完成”按钮仍然只是插入一个新行。检查我更新的问题。
1赞 Sebastian Flückiger 4/10/2012
嗨,你应该能够弄清楚出了什么问题。我向您发布了 UITextField 的代码,您将其复制到 UITextView 而没有更改它。使用 ,实现并使用我为您提供的代码:)当然,UITextView 不能使用 UITextFieldDelegate。但是,如果您真的想坚持使用 TextView,则可以使用该协议。更多信息: developer.apple.com/library/ios/#documentation/uikit/reference/...UITextField<UITextFieldDelegate><UITextViewDelegate>
0赞 Richard Knop 4/11/2012
谢谢。我使用了 UITextVieDelegate 并且它有效。一个问题。是否可以允许多行并且还有一个完成按钮来关闭键盘?我的意思是,是否可以同时拥有返回和完成按钮?
0赞 Sebastian Flückiger 4/11/2012
从来没有尝试过,但你可以在你的班级中设置一个整数,每次有人输入一个字符时,计数器就会增加,当你达到最大行数时,你就辞职了 firstresponder\n
0赞 ideawu 1/14/2015
textFieldShouldReturn 必须实现,而不是 ,它是一个orand
-2赞 Ryan Poolos 4/10/2012 #2

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

然后,您需要检查何时按下“返回”按钮

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

检查文本是否 == “/n”,然后通过在 textView 上辞职第一响应者来关闭键盘。

18赞 Mike Z 4/10/2012 #3

进入你的故事板,选择你的文本字段,在属性检查器下有一个选项,上面写着“返回键”......选择“完成”。

然后进入 ViewController 并添加:

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

然后返回您的文本字段,单击插座并链接“退出时结束”以关闭键盘操作。

评论

0赞 Adrian P 12/27/2012
谢谢迈克,你的回答在我的应用程序中帮助了我。 我给了你一票,谢谢你。艾利安
1赞 Garreth Golding 4/4/2013 #4

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

[textField becomeFirstResponder];
[textField resignFirstResponder];

您的方法应如下所示:

- (IBAction)methodName:(id)sender;
{
    [sender becomeFirstResponder];
    [sender resignFirstResponder];
}
1赞 Donato Perconti 1/30/2014 #5

好的,所以我也一直在为这个问题而苦苦挣扎。目前,我正在访问UITableViewCell中的UITextView(通过标签)。因为我使用的是原型细胞,所以我不能像大家建议的那样使用 IBActions 或 IBOutlets。相反,我正在使用;

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(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];
    }
}

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

12赞 Esqarrouth 10/7/2015 #6

Swift 版本:

在 ViewController 中:

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

在 ViewController 之后

extension MyViewController: UITextFieldDelegate {        
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

评论

2赞 user2161301 5/1/2018
Swift 4 告诉我更新到 ' func textFieldShouldReturn(_ textField: UITextField) -> Bool {'
1赞 DURGESH 7/4/2016 #7

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

textField.returnKeyType = UIReturnKeyDone;
19赞 ViJay Avhad 8/19/2016 #8

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

这是将“完成”按钮添加到任何类型的键盘的更安全、更干净的方式。创建 UIToolBar,向其添加 Done Button,并设置任何 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 For Done 按钮

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

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

SWIFT 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)
  }

评论

0赞 Todd 11/25/2019
在 Xcode 11.2 上,为 iOS 12 构建,除非我使用 .这完全是任意的,但 Xcode 转储了一行: ,所以提供宽度似乎可以解决这个问题let ViewForDoneButtonOnKeyboard = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: 500.0, height: 70))CGRect<NSAutoresizingMaskLayoutConstraint:0x283c6ff70 h=--& v=--& _UIToolbarContentView:0x102c5e7f0.width == 0 (active)>
0赞 AechoLiu 1/25/2018 #9

以下是我的方法,在.单击时,让它发送事件。我使用此事件来处理多个文本字段之间的焦点问题。Swift 3doneBtn.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)
    }
}
0赞 Zulqarnain Naveed 2/20/2023 #10

适用于 Swift 5 及以上版本

    extension UITextField {

   func addDoneButtonOnKeyboard() {
       let keyboardToolbar = UIToolbar()
       keyboardToolbar.sizeToFit()
       let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
           target: nil, action: nil)
       let doneButton = UIBarButtonItem(barButtonSystemItem: .done,
           target: self, action: #selector(resignFirstResponder))
       keyboardToolbar.items = [flexibleSpace, doneButton]
       self.inputAccessoryView = keyboardToolbar
   }
}
extension UITextView{
    func addDoneButtonKeyboard(){
        let keyboardToolbar = UIToolbar()
        keyboardToolbar.sizeToFit()
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                                            target: nil, action: nil)
        let doneButton = UIBarButtonItem(barButtonSystemItem: .done,
                                         target: self, action: #selector(resignFirstResponder))
        keyboardToolbar.items = [flexibleSpace, doneButton]
        self.inputAccessoryView = keyboardToolbar
    }
}
0赞 Some guy 5/8/2023 #11

iOS 14+ 解决方案

编辑:在 iOS 15 上为我工作,但在 iOS 16 上不为我工作

这将在键带上方的字段中心放置一个“完成”按钮。

TextField("MyField")
 .toolbar{
    Button("Done"){
    //Close keyboard
    UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }.tint(.blue)
  }