Как показать кнопку "Готово" на цифровой клавиатуре iPhone
На цифровой клавиатуре нет кнопки "Готово" . Когда пользователь заканчивает ввод числовой информации в текстовое поле, как я могу заставить цифровую панель исчезнуть?
Я мог бы получить кнопку "Готово" , используя клавиатуру по умолчанию, но тогда пользователям пришлось бы переключаться на цифровые клавиши, чтобы вводить числа. Есть ли способ показать кнопку "Готово" на цифровой клавиатуре?
Ответы
Ответ 1
Другое решение. Идеально, если на экране есть другие текстовые поля без номера.
![inputAccessoryView]()
- (void)viewDidLoad
{
[super viewDidLoad];
UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
numberToolbar.barStyle = UIBarStyleBlackTranslucent;
numberToolbar.items = @[[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)]];
[numberToolbar sizeToFit];
numberTextField.inputAccessoryView = numberToolbar;
}
-(void)cancelNumberPad{
[numberTextField resignFirstResponder];
numberTextField.text = @"";
}
-(void)doneWithNumberPad{
NSString *numberFromTheKeyboard = numberTextField.text;
[numberTextField resignFirstResponder];
}
Ответ 2
Вот адаптация для ответа Люды для Swift:
В объявлении вашего подкласса UIViewController поставьте
let numberToolbar: UIToolbar = UIToolbar()
в представлении ViewDidLoad:
numberToolbar.barStyle = UIBarStyle.BlackTranslucent
numberToolbar.items=[
UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Bordered, target: self, action: "hoopla"),
UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
UIBarButtonItem(title: "Apply", style: UIBarButtonItemStyle.Bordered, target: self, action: "boopla")
]
numberToolbar.sizeToFit()
textField.inputAccessoryView = numberToolbar //do it for every relevant textfield if there are more than one
и добавьте функции hoopla и hoopla (не стесняйтесь выбирать другие имена, просто измените имена селекторов в ViewDidLoad соответственно
func boopla () {
textField.resignFirstResponder()
}
func hoopla () {
textField.text=""
textField.resignFirstResponder()
}
Ответ 3
Трюк, который я видел, заключается в том, чтобы сделать пользовательскую прозрачную кнопку размером всего представления, а затем в методе щелчка, чтобы текстовое поле отменило первый ответчик. Таким образом, пользователь может щелкнуть в любом месте за пределами поля, чтобы закрыть клавиатуру.
Ответ 4
Решение в UIKeyboardTypeNumberPad и отсутствующий ключ возврата отлично работает, но только если на экране нет других текстовых полей без номера.
Я взял этот код и превратил его в UIViewController, чтобы вы могли просто подклассом работать с числовыми колодками. Вам нужно будет получить значки из приведенной выше ссылки.
NumberPadViewController.h:
#import <UIKit/UIKit.h>
@interface NumberPadViewController : UIViewController {
UIImage *numberPadDoneImageNormal;
UIImage *numberPadDoneImageHighlighted;
UIButton *numberPadDoneButton;
}
@property (nonatomic, retain) UIImage *numberPadDoneImageNormal;
@property (nonatomic, retain) UIImage *numberPadDoneImageHighlighted;
@property (nonatomic, retain) UIButton *numberPadDoneButton;
- (IBAction)numberPadDoneButton:(id)sender;
@end
и NumberPadViewController.m:
#import "NumberPadViewController.h"
@implementation NumberPadViewController
@synthesize numberPadDoneImageNormal;
@synthesize numberPadDoneImageHighlighted;
@synthesize numberPadDoneButton;
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if ([super initWithNibName:nibName bundle:nibBundle] == nil)
return nil;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
self.numberPadDoneImageNormal = [UIImage imageNamed:@"DoneUp3.png"];
self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"DoneDown3.png"];
} else {
self.numberPadDoneImageNormal = [UIImage imageNamed:@"DoneUp.png"];
self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"DoneDown.png"];
}
return self;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Add listener for keyboard display events
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
} else {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
}
// Add listener for all text fields starting to be edited
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldDidBeginEditing:)
name:UITextFieldTextDidBeginEditingNotification
object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidShowNotification
object:nil];
} else {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardWillShowNotification
object:nil];
}
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UITextFieldTextDidBeginEditingNotification
object:nil];
[super viewWillDisappear:animated];
}
- (UIView *)findFirstResponderUnder:(UIView *)root {
if (root.isFirstResponder)
return root;
for (UIView *subView in root.subviews) {
UIView *firstResponder = [self findFirstResponderUnder:subView];
if (firstResponder != nil)
return firstResponder;
}
return nil;
}
- (UITextField *)findFirstResponderTextField {
UIResponder *firstResponder = [self findFirstResponderUnder:[self.view window]];
if (![firstResponder isKindOfClass:[UITextField class]])
return nil;
return (UITextField *)firstResponder;
}
- (void)updateKeyboardButtonFor:(UITextField *)textField {
// Remove any previous button
[self.numberPadDoneButton removeFromSuperview];
self.numberPadDoneButton = nil;
// Does the text field use a number pad?
if (textField.keyboardType != UIKeyboardTypeNumberPad)
return;
// If there no keyboard yet, don't do anything
if ([[[UIApplication sharedApplication] windows] count] < 2)
return;
UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
// Create new custom button
self.numberPadDoneButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.numberPadDoneButton.frame = CGRectMake(0, 163, 106, 53);
self.numberPadDoneButton.adjustsImageWhenHighlighted = FALSE;
[self.numberPadDoneButton setImage:self.numberPadDoneImageNormal forState:UIControlStateNormal];
[self.numberPadDoneButton setImage:self.numberPadDoneImageHighlighted forState:UIControlStateHighlighted];
[self.numberPadDoneButton addTarget:self action:@selector(numberPadDoneButton:) forControlEvents:UIControlEventTouchUpInside];
// Locate keyboard view and add button
NSString *keyboardPrefix = [[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2 ? @"<UIPeripheralHost" : @"<UIKeyboard";
for (UIView *subView in keyboardWindow.subviews) {
if ([[subView description] hasPrefix:keyboardPrefix]) {
[subView addSubview:self.numberPadDoneButton];
[self.numberPadDoneButton addTarget:self action:@selector(numberPadDoneButton:) forControlEvents:UIControlEventTouchUpInside];
break;
}
}
}
- (void)textFieldDidBeginEditing:(NSNotification *)note {
[self updateKeyboardButtonFor:[note object]];
}
- (void)keyboardWillShow:(NSNotification *)note {
[self updateKeyboardButtonFor:[self findFirstResponderTextField]];
}
- (void)keyboardDidShow:(NSNotification *)note {
[self updateKeyboardButtonFor:[self findFirstResponderTextField]];
}
- (IBAction)numberPadDoneButton:(id)sender {
UITextField *textField = [self findFirstResponderTextField];
[textField resignFirstResponder];
}
- (void)dealloc {
[numberPadDoneImageNormal release];
[numberPadDoneImageHighlighted release];
[numberPadDoneButton release];
[super dealloc];
}
@end
Enjoy.
Ответ 5
Ниже приведена проверка ответа Луды со следующими изменениями:
-
аксессуар выглядит автоматически по ширине рамки приложения
-
избегается устаревшая константа UIBarButtonItemStyleBordered
-
кнопка "Готово" создается как UIBarButtonSystemItemDone
В настоящее время кнопка "Готово" находится в центре аксессуара. Вы можете поместить его влево или вправо, удалив пространство на соответствующей стороне.
Я опустил кнопку "Отмена" , потому что на клавиатуре по умолчанию ее тоже нет. Если вы хотите кнопку "Отмена" , я предлагаю вам создать экземпляр UIBarButtonSystemItemCancel
и убедиться, что вы не отбрасываете исходное значение в текстовом поле. Поведение "Отмена" , реализованное в ответ Luda, которое перезаписывает значение пустой строкой, может быть не таким, каким вы хотите.
- (void)viewDidLoad {
[super viewDidLoad];
float appWidth = CGRectGetWidth([UIScreen mainScreen].applicationFrame);
UIToolbar *accessoryView = [[UIToolbar alloc]
initWithFrame:CGRectMake(0, 0, appWidth, 0.1 * appWidth)];
UIBarButtonItem *space = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
target:nil
action:nil];
UIBarButtonItem *done = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(selectDoneButton)];
accessoryView.items = @[space, done, space];
self.valueField.inputAccessoryView = accessoryView;
}
- (void)selectDoneButton {
[self.valueField resignFirstResponder];
}
Дополнительные сведения о создании аксессуаров см. в документации Apple на пользовательские представления для ввода данных. Вы, вероятно, захотите ознакомиться со справочными страницами UIToolbar и UIBarButtonItem.
Ответ 6
Решение Swift 3 с использованием расширения. Идеально, если у вас есть несколько числовых объектов UITextField
в вашем приложении, поскольку это дает гибкость, чтобы решить, для каждого UITextField
, выполнять ли пользовательское действие, когда UITextField
Done или Cancel.
![enter image description here]()
//
// UITextField+DoneCancelToolbar.swift
//
import UIKit
extension UITextField {
func addDoneCancelToolbar(onDone: (target: Any, action: Selector)? = nil, onCancel: (target: Any, action: Selector)? = nil) {
let onCancel = onCancel ?? (target: self, action: #selector(cancelButtonTapped))
let onDone = onDone ?? (target: self, action: #selector(doneButtonTapped))
let toolbar: UIToolbar = UIToolbar()
toolbar.barStyle = .default
toolbar.items = [
UIBarButtonItem(title: "Cancel", style: .plain, target: onCancel.target, action: onCancel.action),
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
UIBarButtonItem(title: "Done", style: .done, target: onDone.target, action: onDone.action)
]
toolbar.sizeToFit()
self.inputAccessoryView = toolbar
}
// Default actions:
func doneButtonTapped() { self.resignFirstResponder() }
func cancelButtonTapped() { self.resignFirstResponder() }
}
Пример использования с использованием действий по умолчанию:
//
// MyViewController.swift
//
@IBOutlet weak var myNumericTextField: UITextField! {
didSet { myNumericTextField?.addDoneCancelToolbar() }
}
Пример использования пользовательского действия Done:
//
// MyViewController.swift
//
@IBOutlet weak var myNumericTextField: UITextField! {
didSet {
myNumericTextField?.addDoneCancelToolbar(onDone: (target: self, action: #selector(doneButtonTappedForMyNumericTextField)))
}
}
func doneButtonTappedForMyNumericTextField() {
print("Done");
myNumericTextField.resignFirstResponder()
}
Ответ 7
Вот самый последний код. Просто включите #import "UIViewController + NumPadReturn.h" в вашем viewController.
Вот .h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UIViewController (NumPadReturn)
@end
И .m
#import "UIViewController+NumPadReturn.h"
@implementation UIViewController (NumPadReturn)
-(void) viewDidLoad{
// add observer for the respective notifications (depending on the os version)
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
} else {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
}
}
- (void)keyboardWillShow:(NSNotification *)note {
// if clause is just an additional precaution, you could also dismiss it
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 3.2) {
[self addButtonToKeyboard];
}
}
- (void)keyboardDidShow:(NSNotification *)note {
// if clause is just an additional precaution, you could also dismiss it
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
[self addButtonToKeyboard];
}
}
- (void)addButtonToKeyboard {
// create custom button
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(0, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
[doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
} else {
[doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
}
[doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];
// locate keyboard view
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++) {
keyboard = [tempWindow.subviews objectAtIndex:i];
// keyboard found, add the button
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
[keyboard addSubview:doneButton];
} else {
if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
[keyboard addSubview:doneButton];
}
}
}
- (void)doneButton:(id)sender {
NSLog(@"doneButton");
[self.view endEditing:TRUE];
}
@end
Ответ 8
Более простое решение
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
[textViewInstance1 resignFirstResponder];
[textViewInstance2 resignFirstResponder];
[textField resignFirstResponder];
}
Ответ 9
Этот пост форума описывает, как настроить UIKeyboard, чтобы добавить свой пользовательский вид на клавиатуру.
Ответ 10
Я нашел @user1258240 answer, чтобы быть довольно кратким, поскольку это не так просто, как установка свойства returnKeyType
.
Просто хотел внести свой собственный "повторно используемый" подход к этому:
func SetDoneToolbar(field:UITextField) {
let doneToolbar:UIToolbar = UIToolbar()
doneToolbar.items=[
UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil),
UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.dismissKeyboard))
]
doneToolbar.sizeToFit()
field.inputAccessoryView = doneToolbar
}
override func viewDidLoad() {
super.viewDidLoad()
SetDoneToolbar(field: UITextField_1)
SetDoneToolbar(field: UITextField_2)
SetDoneToolbar(field: UITextField_3)
SetDoneToolbar(field: UITextField_N)
}
Ответ 11
SWIFT 3.0. Разный вкус, используя некоторые части предыдущих ответов.
func addToolbarToNumberPad()
{
let numberPadToolbar: UIToolbar = UIToolbar()
numberPadToolbar.isTranslucent = true
numberPadToolbar.items=[
UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelAction)),
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
UIBarButtonItem(title: "Custom", style: .done, target: self, action: #selector(self.customAction)),
UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.doneAction)),
]
numberPadToolbar.sizeToFit()
textField.inputAccessoryView = numberPadToolbar
}
func cancelAction()
{
textField.resignFirstResponder()
}
func customAction()
{
textField.resignFirstResponder()
}
func doneAction()
{
textField.resignFirstResponder()
}
override func viewDidLoad()
{
super.viewDidLoad()
self.addToolbarToNumberPad()
}
Ответ 12
Я описываю одно решение для iOS 4.2+ здесь, но кнопка закрытия исчезает после появления клавиатуры. Это не страшно, но и не идеально.
Решение, описанное в упомянутом выше вопросе, включает в себя более элегантную иллюзию, чтобы отклонить кнопку, где я исчезаю и вертикально перемещаю кнопку, чтобы обеспечить внешний вид, который клавиатура и кнопка отклоняются вместе.
Ответ 13
Простейший способ :
Создайте настраиваемую прозрачную кнопку и поместите ее в левый нижний угол, который будет иметь те же CGSize
как пустое пространство в UIKeyboardTypeNumberPad
. Переключить (показать/скрыть) эту кнопку на textField becomeFirstResponder
, при нажатии кнопки соответственно.
Ответ 14
Здесь самое простое решение, с которым я столкнулся. Я узнал об этом из книги разработки iOS 5 Development.
Предполагая, что числовое число называется numberField
.
-
В ViewController
добавьте следующий метод:
-(IBAction)closeKeyboard:(id)sender;
-
В ViewController.m
добавьте следующий код:
-(IBAction)closeKeyboard:(id)sender
{
[numberField resignFirstResponder];
}
-
Вернитесь к файлу nib
.
- Откройте
Utilities
панорамирование.
- Откройте
Identity inspector
в панели Utilities
.
- Нажмите
View
(в файле nib) один раз. Убедитесь, что вы не нажали ни на один из элементов в представлении. Для пояснения вы должны увидеть UIView под Class
в Identity inspector
.
- Измените класс с UIView на UIControl.
- Откройте
Connection Inspector
.
- Нажмите и перетащите
Touch Down
и отпустите стрелку на значке File Owner
. (FYI... Значок файла владельца отображается слева от View
и отображается как полый куб с желтой рамкой.)
- Выберите метод:
closeKeyboard
.
- Запустите программу.
Теперь, когда вы нажимаете в любом месте на фоне View
, вы можете убрать клавиатуру.
Надеюсь, это поможет вам решить вашу проблему.: -)
Ответ 15
Я изменил решение Bryan, чтобы быть немного более надежным, так что он будет хорошо играть с другими типами клавиатур, которые могут отображаться в одном представлении. Это описано здесь:
Создать кнопку DONE на iOS-клавиатуре UIKeyboard
Я бы попытался объяснить это здесь, но большинство из них - это код, который можно посмотреть здесь, и это не будет легко помещаться здесь.
Ответ 16
Если вы заранее знаете количество вводимых чисел (например, 4-значный ПИН-код), вы можете автоматически уволить после 4 нажатий клавиш, согласно моему ответу на этот похожий вопрос:
отклонение номерной панели
В этом случае нет необходимости в дополнительной кнопке.
Ответ 17
Мы также можем заставить пользователя "коснуться где-то еще". решение еще проще, если мы просто скажем, что представление нашего контроллера контроля прекратит редактирование:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
[self.view endEditing:YES]; //YES ignores any textfield refusal to resign
}
... предполагая, что "прикосновение в другом месте отклоняет клавиатуру" является желательным поведением для любых других редактируемых полей на представлении.
Ответ 18
Если у вас есть несколько числовых полей, я предлагаю создать подкласс UITextField, чтобы создать NumericTextField, который всегда отображает цифровую клавиатуру с кнопкой "Готово". Затем просто свяжите ваши числовые поля с этим классом в Интерфейсном Разработчике, и вам не понадобится дополнительный код ни в одном из ваших контроллеров представления. Ниже приведен класс Swift 3.0, который я использую в Xcode 8.0.
class NumericTextField: UITextField {
let numericKbdToolbar = UIToolbar()
// MARK: Initilization
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.initialize()
}
// Sets up the input accessory view with a Done button that closes the keyboard
func initialize()
{
self.keyboardType = UIKeyboardType.numberPad
numericKbdToolbar.barStyle = UIBarStyle.default
let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let callback = #selector(NumericTextField.finishedEditing)
let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: callback)
numericKbdToolbar.setItems([space, donebutton], animated: false)
numericKbdToolbar.sizeToFit()
self.inputAccessoryView = numericKbdToolbar
}
// MARK: On Finished Editing Function
func finishedEditing()
{
self.resignFirstResponder()
}
}
Swift 4.2
class NumericTextField: ScaledFontTextField {
let numericKbdToolbar = UIToolbar()
// MARK: Initilization
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.initialize()
}
// Sets up the input accessory view with a Done button that closes the keyboard
func initialize()
{
self.keyboardType = UIKeyboardType.numberPad
numericKbdToolbar.barStyle = UIBarStyle.default
let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
let callback = #selector(NumericTextField.finishedEditing)
let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: callback)
numericKbdToolbar.setItems([space, donebutton], animated: false)
numericKbdToolbar.sizeToFit()
self.inputAccessoryView = numericKbdToolbar
}
// MARK: On Finished Editing Function
@objc func finishedEditing()
{
self.resignFirstResponder()
}
}
Ответ 19
Для Swift 2.2 я использую этот
func addDoneButtonOnKeyboard() {
let doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))
let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(DetailViewController.finishDecimalKeypad))
var items: [UIBarButtonItem]? = [UIBarButtonItem]()
items?.append(flexSpace)
items?.append(done)
doneToolbar.items = items
doneToolbar.sizeToFit()
self.productPrice.inputAccessoryView=doneToolbar
}
func finishDecimalKeypad() {
self.productPrice?.resignFirstResponder()
}
Ответ 20
Вся эта реализация об обнаружении вида клавиатуры и добавлении сделанной кнопки в третьей строке (именно поэтому button.y = 163 b/c высота клавиатуры - 216) хрупки, потому что iOS сохраняет изменение иерархии представлений. Например, ни один из вышеперечисленных кодов не работает для iOS9.
Я думаю, что более безопасно просто найти самый верхний вид, используя [[[UIApplication sharedApplication] windows] lastObject] и просто добавить кнопку в нижнем левом углу, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT- 53, 106, 53);//портретный режим
Ответ 21
Swift 2.2/Я использовал Dx_ ответ. Тем не менее, я хотел эту функциональность на всех клавиатурах. Поэтому в моем базовом классе я помещаю код:
func addDoneButtonForTextFields(views: [UIView]) {
for view in views {
if let textField = view as? UITextField {
let doneToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))
let flexSpace = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
let done = UIBarButtonItem(title: "Done", style: .Done, target: self, action: #selector(dismissKeyboard))
var items = [UIBarButtonItem]()
items.append(flexSpace)
items.append(done)
doneToolbar.items = items
doneToolbar.sizeToFit()
textField.inputAccessoryView = doneToolbar
} else {
addDoneButtonForTextFields(view.subviews)
}
}
}
func dismissKeyboard() {
dismissKeyboardForTextFields(self.view.subviews)
}
func dismissKeyboardForTextFields(views: [UIView]) {
for view in views {
if let textField = view as? UITextField {
textField.resignFirstResponder()
} else {
dismissKeyboardForTextFields(view.subviews)
}
}
}
Затем просто вызовите addDoneButtonForTextFields на self.view.subviews в viewDidLoad (или willDisplayCell при использовании табличного представления), чтобы добавить кнопку "Готово" ко всем клавиатурам.