如何在IOS键盘顶部的键盘上添加完成按钮?

Posted

技术标签:

【中文标题】如何在IOS键盘顶部的键盘上添加完成按钮?【英文标题】:How to add done button on keyboard on top of keyboard in IOS? 【发布时间】:2016-03-19 13:17:07 【问题描述】:

我想在 ios 右侧的键盘顶部添加 Done 按钮作为 textView。请告诉我该怎么做?

我想实现类似于上面键盘的东西

【问题讨论】:

你可以使用 UIToolbar! 创建一个自定义视图,然后在您的keyboardOnScreen 通知方法中显示它......它也带有键盘高度,所以你知道在哪里放置栏 你如何使用工具栏 以上屏幕与 IQKeyboardManager 有关,请添加 pod 文件,它会自动管理,如上图所示。检查此链接github.com/hackiftekhar/IQKeyboardManager,进行设置 【参考方案1】:

希望有帮助:)

UIToolbar* keyboardToolbar = [[UIToolbar alloc] init];
[keyboardToolbar sizeToFit];
UIBarButtonItem *flexBarButton = [[UIBarButtonItem alloc]
                                  initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                  target:nil action:nil];
UIBarButtonItem *doneBarButton = [[UIBarButtonItem alloc]
                                  initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                  target:self action:@selector(yourTextViewDoneButtonPressed)];
keyboardToolbar.items = @[flexBarButton, doneBarButton];
self.yourTextView.inputAccessoryView = keyboardToolbar;

然后添加 yourTextViewDoneButtonPressed 方法

-(void)yourTextViewDoneButtonPressed

    [self.yourTextView resignFirstResponder];

【讨论】:

如何隐藏键盘? @deepakkumar 你是什么意思?如果你想隐藏键盘,只需调用一个方法 [self.yourTextView resignFirstResponder]; 如果键盘被隐藏则工具栏没有被隐藏。请告诉怎么做? 我刚刚做了一个简单的测试,效果很好。 postimg.org/image/tjxdwj3f3postimg.org/image/rquh87i8f 但是收费栏没有消失。wehn 键盘消失了【参考方案2】:

可以使用故事板来完成:

    将 UITextField 添加到 UIViewController 视图。 在一级UIViewController中添加UIToolbar 将 UIBarButtonItem 添加到 UIToolbar。 使用 IBOutlet 将 UItoolbar 连接到代码。 使用 IBAction 将 UIBarButtonItem 连接到代码(与 didClick 一样)。 使 UITextField 将委托给 UIViewController。 在didClick函数结束编辑(view.endEditing(true)) 在委托函数中 textFieldShouldBeginEditing 应该是:textField.inputAccessoryView = toolbar并返回true。李>

【讨论】:

这很好,但是我想为 UITextView 做同样的事情?需要有什么不同。我编辑了我的想法,但得到了无法分配 UIButtonBarItem 类型的值!输入 UIView @adamprocter 您应该将工具栏分配给 textView.inputAccessoryView,而不是 UIButtonBarItem。 真棒@Ramis (Y) 非常感谢。【参考方案3】:

斯威夫特 3:

func setDoneOnKeyboard() 
    let keyboardToolbar = UIToolbar()
    keyboardToolbar.sizeToFit()
    let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(InsertStatusVC.dismissKeyboard))
    keyboardToolbar.items = [flexBarButton, doneBarButton]
    self.fullNameTextField.inputAccessoryView = keyboardToolbar


@objc func dismissKeyboard() 
    view.endEditing(true)

【讨论】:

【参考方案4】:

此解决方案适用于 Swift3/4

将此行作为扩展添加到您的项目中 你的问题解决了。

  extension UITextField

        @IBInspectable var doneAccessory: Bool
            get
                return self.doneAccessory
            
            set (hasDone) 
                if hasDone
                    addDoneButtonOnKeyboard()
                
            
        

        func addDoneButtonOnKeyboard()
        
            let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
            doneToolbar.barStyle = .default

            let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
            let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction))

            let items = [flexSpace, done]
            doneToolbar.items = items
            doneToolbar.sizeToFit()

            self.inputAccessoryView = doneToolbar
        

        @objc func doneButtonAction() 
            self.resignFirstResponder()
        

    

扩展之前

扩展之后

【讨论】:

也适用于 UITextView。谢谢! 在调用时像这样暴露doneAccessory getter 会导致无限循环get return self.doneAccessory @anup-gupta 它工作得很好,但我得到的唯一问题是这个警告All paths through this function will call itself在这条线上get【参考方案5】:

Swift 4Swift 5 使用自定义类的解决方案。您可以在 Storyboard 和 .xib 文件中使用此类。

class UITextFieldWithDoneButton: UITextField 
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.addDoneButtonOnKeyboard()
    

    fileprivate func addDoneButtonOnKeyboard() 
        let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        doneToolbar.barStyle = .default

        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction))

        let items = [flexSpace, done]
        doneToolbar.items = items
        doneToolbar.sizeToFit()

        self.inputAccessoryView = doneToolbar
    

    @objc fileprivate func doneButtonAction() 
        self.resignFirstResponder()
    

【讨论】:

这个解决方案在 Xcode 10.2 和 Swift 5.0 中有效。谢谢基里尔。 非常好的解决方案thanx分享!!也可以用作 TextView :-) 不错的解决方案!避免代码重复的最佳方法。【参考方案6】:

Swift 4 的这个解决方案

override func viewDidLoad() 
   super.viewDidLoad()
   //init toolbar
   let toolbar:UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0,  width: self.view.frame.size.width, height: 30))
   //create left side empty space so that done button set on right side
   let flexSpace = UIBarButtonItem(barButtonSystemItem:    .flexibleSpace, target: nil, action: nil)
   let doneBtn: UIBarButtonItem = UIBarButtonItem(title: “Done”, style: .done, target: self, action: Selector(“doneButtonAction”))
   toolbar.setItems([flexSpace, doneBtn], animated: false)
   toolbar.sizeToFit()
   //setting toolbar as inputAccessoryView
   self.textField1.inputAccessoryView = toolbar
   self.textField2.inputAccessoryView = toolbar

func doneButtonAction() 
   self.view.endEditing(true)

【讨论】:

【参考方案7】:

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

这是将完成按钮添加到任何类型键盘的更安全、更简洁的方法。创建 UIToolBar 添加 Done Button 并设置任何 UITextField 或 UITextView 的 inputAccessoryView。 ];

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)
  

【讨论】:

“创建 UIToolbar”:代码中的文件?一个 UIBuilder 对象?更具体。【参考方案8】:

Ramis 的回答是允许使用情节提要创建键盘附件视图,这是一个很好的策略。毕竟是2017年! (抱歉,我没有足够的积分来支持你。)

让我补充一点答案(以遵守 SO 规则)。我有多个文本字段的视图。在执行了 Ramis 的每个步骤后,我以这种方式将附件视图附加到所有文本字段:

-(void)textFieldDidBeginEditing:(UITextField *)textField

_activeTextField = textField;
[_activeTextField setInputAccessoryView:_iboKeyboardTools];

与在代码中实现所有这些相比,这太容易了!只需在 Storyboard 中构建附件视图,然后一次又一次地附加它!

【讨论】:

以上是关于如何在IOS键盘顶部的键盘上添加完成按钮?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中编辑键盘布局

如何在键盘中添加完成按钮

如何在 ios 8 中获取键盘位置并在 numberPad 上添加 DONE 按钮

更改 iOS 虚拟键盘“上一个”、“下一个”、“完成”按钮的语言

iOS 7:如何隐藏键盘上的 DONE 按钮

如何在PhoneGap textarea中隐藏键盘完成按钮?