Як відобразити кнопку "Готово" на цифровій панелі 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
Інше рішення дуже крихке з точки зору будь-яких графічних змін на екранній клавіатурі порушить його.
кайлоун

Якщо є кілька текстових полів, як визначити, яке UITextField редагується?
Нейт

Визначте своє UITextField у .h як змінну примірника.
Люда

3
@BenPotter Ви б встановили barTint для кольору смужки та кольору відтінку тексту. Ви також можете створити елементи UIBarButton поза стороною інструменту та встановити там колір для них.
окрос

50

Ось адаптація відповіді Люди для Свіфта:

У декларації вашого підкласу UIViewController покладено

let numberToolbar: UIToolbar = UIToolbar()

у ViewDidLoad put:

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

1
UIBarButtonItemStyle.Borderedзастаріло з iOS 8.0. UIBarButtonItemStyle.Plainзамість цього пропонується.
Jonny

Селектори слід оновити до: #selector (YourViewController.boopla)
David V

Джонні і Девід, мабуть, праві. Я більше не програмую для iOS, тому не слідкую за змінами. Якщо хтось опублікує оновлене рішення, я посилаюся на нього в редакції.
користувач1258240

14

Я бачив хитрість, щоб створити спеціальну прозору кнопку розміром з усього перегляду, а потім у способі клацання запропонувати текстовому полі подати у відставку першим відповіддю. Таким чином користувач може натиснути будь-де за межами поля, щоб відхилити клавіатуру.


3
Я зробив це на додаток до клавіші Return. Це робить набагато більш зручним додаток. Мені подобається давати як кнопки повернення, так і способи повернення в будь-якому місці.
IcyBlueRose

4
Тепер, коли у нас є UIGestureRecognizers, просто встановіть розпізнавальник жестів на дотик на головному вікні контролера перегляду та надішлете його endEditing: ТАК на його перегляд. Це закриє клавіатуру для кожного текстового поля, яке клавіатура могла б обслуговувати, якщо торкатися її за межами клавіатури.
чадбаг

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

Приклад використання за допомогою спеціальної дії " Готово" :

//
// 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

Наразі кнопка "Готово" зосереджена у вікні аксесуарів. Ви можете розташувати його зліва або справа, видаливши пробіл на відповідній стороні.

Я пропустив кнопку "Скасувати", оскільки клавіатура за замовчуванням не має жодної. Якщо ви хочете натиснути кнопку "Скасувати", я пропоную вам позначити її як a 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 щодо спеціальних подань для введення даних . Ви, ймовірно, захочете ознайомитись із довідковими сторінками на панелі UITool і UIBarButtonItem .


[UIScreen mainScreen].applicationFrameзастаріло в iOS 9. Використання[UIScreen mainScreen].bounds
користувач-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" у свій переглядController.

Ось .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

це, здається, працює на тренажері, але на пристрої ... ні я не бачу кнопку "ЗРОБАНО", ні щось не відбувається, коли натискаю порожній простір ... будь-яка ідея?
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, який завжди відображає цифрову клавіатуру із виконаною кнопкою. Потім просто пов'яжіть свої числові поля з цим класом у Builder інтерфейсу, і вам не знадобиться додатковий код у будь-якому з ваших контролерів перегляду. Далі йде клас 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()
    }
}

Швидкий 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

Я опишу один рішення для прошивки 4.2+ тут , але розпускати кнопку зникає в після з'являється клавіатура. Це не страшно, але і не ідеально.

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


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один раз (у файлі nib). Переконайтеся, що ви не натиснули жодного з елементів у вікні перегляду. Для уточнення слід побачити UIView під ClassвIdentity inspector .
  7. Змініть клас з UIView на UIControl.
  8. Відкрити Connection Inspector.
  9. Клацніть і перетягніть Touch Downстрілку на File Ownerпіктограму. (FYI ... Піктограма власника файлу відображається зліва від Viewі відображається як порожнистий куб із жовтою рамкою.)
  10. Виберіть метод: closeKeyboard.
  11. Запустіть програму.

Тепер, коли ви натискаєте будь-де на тлі View , ви повинні мати можливість відхилити клавіатуру.

Сподіваюся, що це допоможе вам вирішити свою проблему. :-)


2

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

Створіть кнопку ДОБРОНО на UIKeyboard iOS numpad

Я б спробував пояснити це тут, але більшість із них - це код, на який слід поглянути, який би тут не легко вписався


Це було найкращим рішенням, яке я знайшов для XCode 4.5, і він працює з iOS 6.0. Він додає кнопку "ЗРОБАНО" на цифровій клавіатурі. Перейдіть до оригінальної публікації, щоб отримати графіку КРАЙНО. neoos.ch/blog/…
птиця

2

Якщо ви знаєте заздалегідь кількість номерів, які потрібно ввести (наприклад, 4-значний PIN-код), ви можете автоматично відхилити після 4 натискань клавіш, відповідно до моєї відповіді на подібне запитання:

відхилення номерного блоку

У цьому випадку не потрібно додаткової кнопки.


2

Ми також можемо зробити рішення "доторкнувся до іншого користувача" ще простішим, якщо просто скажемо погляд нашого контролера перегляду, щоб закінчити редагування:

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

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

... припускаючи, що "дотик до іншого місця відхиляє клавіатуру" є бажаною поведінкою і для будь-яких інших редагованих полів.


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

0

Усі реалізація щодо пошуку подання на клавіатурі та додавання кнопки "виконане" у 3-му ряду (саме тому button.y = 163 висота клавіатури b / c становить 216) є крихкою, оскільки iOS постійно змінює ієрархію перегляду. Наприклад, жоден з наведених вище кодів не працює для iOS9.

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


0

Швидкий 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, якщо використовується подання таблиці), щоб додати кнопку Done до всіх клавіатур.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.