Как показать кнопку «Готово» на цифровой клавиатуре iPhone

237

На цифровой клавиатуре нет кнопки «Готово». Когда пользователь заканчивает ввод числовой информации в текстовое поле, как я могу заставить цифровую клавиатуру исчезнуть?

Я мог получить кнопку «Готово», используя клавиатуру по умолчанию, но тогда пользователям пришлось бы переключаться на цифровые клавиши для ввода цифр. Есть ли способ показать кнопку «Готово» на цифровой клавиатуре?

Холодный чжун
источник

Ответы:

339

Другое решение Идеально, если на экране есть другие текстовые поля без нумерации.

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];
}
Люда
источник
1
Без сомнения, лучший способ сделать это. Явно потому что придерживается яблок строгого HIG.
Хьюберт Куннемейер
3
Другое решение является очень хрупким с точки зрения любых графических изменений, которые могут привести к поломке экранной клавиатуры.
Kailoon
Если есть несколько текстовых полей, как мне определить, какой UITextField редактируется?
конец
Определите ваш UITextField в .h как переменную экземпляра.
Люда
3
@BenPotter Вы должны установить barTint для цвета полосы и цвета оттенка для текста. Вы также можете создать элементы UIBarButton вне инициализатора и явно указать для них цвет.
ocross
50

Вот адаптация к ответу Люды для 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()
}
user1258240
источник
1
UIBarButtonItemStyle.Borderedустарела с iOS 8.0. UIBarButtonItemStyle.Plainпредлагается вместо
Джонни
Селекторы должны быть обновлены до: #selector (YourViewController.boopla)
Дэвид V
Джонни и Дэвид, вероятно, правы. Я больше не программирую для iOS, поэтому не отслеживаю изменения. Если кто-нибудь опубликует обновленное решение, я буду ссылаться на него в редактировании.
user1258240
14

Уловка, которую я использовал, заключается в том, чтобы сделать настраиваемую прозрачную кнопку размером всего представления, а затем в методе щелчка оставить текстовое поле в качестве первого респондента. Таким образом, пользователь может щелкнуть в любом месте за пределами поля, чтобы закрыть клавиатуру.

davidavr
источник
3
Я сделал это в дополнение к ключу возврата. Это делает приложение более удобным для пользователя. Мне нравится давать как ключи возврата, так и методы возврата в любом месте.
IcyBlueRose
4
теперь, когда у нас есть UIGestureRecognizer, просто настройте распознаватель жестов касания в главном представлении контроллера и отправьте в его представление endEditing: YES. Это закроет клавиатуру для каждого текстового поля, которое клавиатура может обслуживать, при касании за пределами клавиатуры.
Чедбаг
14

Решение Swift 3 с использованием расширения. Идеально, если у вас есть несколько числовых UITextFieldобъектов в вашем приложении, поскольку оно дает гибкость, чтобы решить для каждого UITextField, выполнять ли пользовательское действие, когда нажимается «Готово» или « Отмена» .

введите описание изображения здесь

//
//  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() 
}
оли
источник
12

Ниже приведен пересмотр ответа Люды со следующими изменениями:

  • вспомогательный вид автоматически изменяется по ширине рамки приложения

  • устарелая постоянная UIBarButtonItemStyleBorderedисключается

  • кнопка «Готово» создается как UIBarButtonSystemItemDone

В настоящее время кнопка «Готово» находится по центру в дополнительном представлении. Вы можете расположить его слева или справа, удалив пространство на соответствующей стороне.

Я пропустил кнопку «Отмена», потому что на клавиатуре по умолчанию ее тоже нет. Если вам нужна кнопка «Отмена», я предлагаю вам создать ее как кнопку UIBarButtonSystemItemCancelи убедиться, что вы не сбрасываете исходное значение в текстовом поле. Поведение «Отмена», реализованное в ответе Люды, который перезаписывает значение пустой строкой, может не соответствовать вашему желанию.

- (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 .

Майкл Ласло
источник
[UIScreen mainScreen].applicationFrameустарела в iOS 9. Использование[UIScreen mainScreen].bounds
user-44651
11

Решение в 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's 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

Наслаждаться.

Арчи
источник
6

Вот самый последний код. Просто включите #import "UIViewController + NumPadReturn.h" в свой viewController.

Вот это .h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface UIViewController (NumPadReturn)



@end

И им

#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
Bryan
источник
кажется, это работает на симуляторе, но на устройстве ... ни я не вижу кнопку "ГОТОВО", и ничего не происходит, когда я нажимаю на пустое место ... есть идеи?
xoail
14
Вау, пожалуйста, не используйте этот код. Вы переопределяете методы класса внутри категории, что приведет к игнорированию «реального» viewDidLoad и т. Д. Из вашего класса UIViewController.
Тони Арнольд
6

Гораздо более простое решение

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event];

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
Говинд
источник
5

Если у вас есть несколько числовых полей, я предлагаю создать подкласс 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: 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: 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()
    }
}
Марио Хендрикс
источник
Я предпочитаю ваше решение подкласса.
AechoLiu
5

Я нашел ответ @ user1258240 довольно кратким, учитывая, что это не так просто, как установкаreturnKeyType свойство.

Просто хотел внести свой собственный подход «многоразового использования» к этому:

func SetDoneToolbar(field:UITextField) {
    let doneToolbar:UIToolbar = UIToolbar()

    doneToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.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)
}
Мэтт Борха
источник
3

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()
}
Абдуррахман Мубин Али
источник
2

Я опишу одно решение для iOS 4.2+ здесь , но распускать кнопку исчезает в после появляется клавиатура. Это не страшно, но и не идеально.

Решение, описанное в вопросе, связанном выше, включает в себя более изящную иллюзию отклонения кнопки, когда я замираю и вертикально смещаю кнопку, чтобы создать впечатление, что клавиатура и кнопка сбрасываются вместе.

FluffulousChimp
источник
2

Самый простой способ:

создать пользовательскую прозрачную кнопку и поместить ее в левый нижний угол, который будет иметь такое же CGSizeпространство, как и в UIKeyboardTypeNumberPad. Переключить (показать / скрыть) эту кнопку на textField becomeFirstResponder, при нажатии кнопки соответственно.

Алмас Адильбек
источник
2

Вот самое простое решение, с которым я столкнулся. Я узнал об этом из книги «Начало разработки под iOS 5».

Предполагается, что числовое поле называется numberField.

  1. В ViewControllerдобавьте следующий метод:

    -(IBAction)closeKeyboard:(id)sender;
  2. В ViewController.mдобавьте следующий код:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
  3. Вернуться к nibфайлу.

  4. Откройте Utilitiesкастрюлю.
  5. Откройте Identity inspectorпод Utilitiesсковородой.
  6. Нажмите на View(в файле пера) один раз. Убедитесь, что вы не нажали ни на один из элементов в представлении. Для пояснения, вы должны увидеть UIView под ClassвIdentity inspector .
  7. Измените класс с UIView на UIControl.
  8. Open Connection Inspector.
  9. Нажмите и перетащите Touch Downстрелку на File Ownerиконку. (FYI ... Значок владельца файла отображается слева Viewи отображается как полый куб с желтой рамкой.)
  10. Выберите метод: closeKeyboard.
  11. Запустите программу.

Теперь, когда вы щелкнете где-нибудь на фоне View, вы сможете убрать клавиатуру.

Надеюсь, это поможет вам решить вашу проблему. :-)

Рутвий Котеча
источник
2

Я изменил решение Брайана, чтобы оно было немного более надежным, чтобы оно хорошо сочеталось с другими типами клавиатур, которые могут отображаться в том же виде. Это описано здесь:

Создать кнопку Готово на iOS Numpad UIKeyboard

Я бы попытался объяснить это здесь, но большая часть кода представляет собой код, который не очень легко уместится здесь.

horseshoe7
источник
Это было лучшее решение, которое я нашел для XCode 4.5, и оно работает с iOS 6.0. Он добавляет кнопку «Готово» к цифровой клавиатуре. Перейти к исходному сообщению, чтобы получить кнопку Готово графику. neoos.ch/blog/…
птичник
2

Если вы заранее знаете количество вводимых чисел (например, 4-значный PIN-код), вы можете автоматически отклонить его после 4 нажатий клавиш, как указано в моем ответе на аналогичный вопрос:

распуская цифровую клавиатуру

В этом случае нет необходимости в дополнительной кнопке «Готово».

scipilot
источник
2

Мы также можем сделать решение «пользователь потрогал куда-то еще» еще проще, если мы просто скажем представлению нашего контроллера представления закончить редактирование:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 { 
      [super touchesBegan:touches withEvent:event];

      [self.view endEditing:YES]; //YES ignores any textfield refusal to resign
 }

... предполагая, что "прикосновение к чему-то другому приводит к отклонению клавиатуры" - желаемое поведение для любых других редактируемых полей в представлении.

Sitric
источник
1

Для 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()
}
Dx_
источник
0

Вся эта реализация, связанная с поиском вида с клавиатуры и добавлением кнопки «Готово» в 3-й строке (вот почему высота кнопки button.y = 163 b / c равна 216), хрупка, потому что iOS продолжает изменять иерархию представлений. Например, ни один из приведенных выше кодов не работает для iOS9.

Я думаю, что более безопасно просто найти самый верхний вид с помощью [[[UIApplication sharedApplication] windows] lastObject] и просто добавить кнопку в левом нижнем углу, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // портретный режим

Qiulang
источник
0

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, если используется табличное представление), чтобы добавить кнопку «Готово» на все клавиатуры.

Джон
источник