it-swarm.com.ru

Как добавить готовую кнопку на клавиатуре поверх клавиатуры в IOS?

Я хочу добавить кнопку Done в верхней части клавиатуры на правой стороне iOS для textView. Скажите, пожалуйста, как я могу это сделать?

 enter image description here

Я хочу добиться чего-то похожего на приведенную выше клавиатуру

21
TechGuy

Это можно сделать с помощью раскадровки:

  1. Добавьте UITextField в представление UIViewController.
  2. Добавьте UIToolbar в первый уровень UIViewController
  3. Добавьте UIBarButtonItem в панель инструментов UITool.
  4. Подключите UItoolbar к коду с помощью IBOutlet.
  5. Подключите UIBarButtonItem к коду, используя IBAction (как didClick).
  6. Сделать UITextField будет делегировать UIViewController.
  7. В функции didClick завершите редактирование (view.endEditing (true))
  8. В функции делегата textFieldShouldBeginEditing должно быть: textField.inputAccessoryView = панель инструментов и возвращает true.

 enter image description here

27
Ramis

Надеюсь это поможет :)

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;

а затем добавьте ваш метод TextViewDoneButtonPressed

-(void)yourTextViewDoneButtonPressed
{
    [self.yourTextView resignFirstResponder];
}
24
Cong Tran

Swift 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)
}
23
Danny182

Это решение для 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()
        }

    }

До расширение 

 enter image description here

После расширение 

 enter image description here

5
Anup Gupta

Добавить UIToolBar в качестве пользовательского представления, в котором будет UIBarButtonItem как кнопка «Готово».

Это более безопасный и чистый способ добавить кнопку «Готово» на клавиатуру любого типа. Создайте UIToolBar, добавьте кнопку «Готово» к нему и установите inputAccessoryView любого UITextField или UITextView. .__];. }

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)
  }
1
ViJay Avhad

Это решение для 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)
}
0
Shoukat Mirza

Ответ Рамиса, который позволяет создавать вспомогательное представление клавиатуры с помощью раскадровки, - отличная стратегия. В конце концов, это 2017 год! (Извините, но у меня недостаточно очков, чтобы проголосовать.)

Позвольте мне добавить немного к ответу (чтобы соответствовать правилам SO). У меня есть представление с несколькими textFields. После реализации каждого из шагов Рамиса я прикрепил accessoryView ко всем текстовым полям следующим образом:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
_activeTextField = textField;
[_activeTextField setInputAccessoryView:_iboKeyboardTools];
}

Так легко по сравнению с реализацией всего этого в коде! Просто создайте вспомогательный вид в раскадровке и присоединяйте его снова и снова!

0
Steve W.

Решение для Swift 4 с использованием пользовательского класса. Вы можете использовать этот класс в ваших файлах раскадровки и .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()
    }
}
0
Kirill Kudaev