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

голоса
208

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

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

Задан 25/02/2009 в 03:45
источник пользователем
На других языках...                            


21 ответов

голоса
321

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

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];
}
Ответил 08/07/2012 в 10:26
источник пользователем

голоса
37

Вот приспособление для ответа Люда для 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 

и добавить функции шумихи и шумиху (не стесняйтесь выбрать другие имена, просто измените имена селекторов в ViewDidLoad соответственно

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
Ответил 24/02/2015 в 22:24
источник пользователем

голоса
14

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

Ответил 25/02/2009 в 05:07
источник пользователем

голоса
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

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

Ответил 05/08/2010 в 21:16
источник пользователем

голоса
9

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

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

  • Устаревшие постоянная 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 , а также.

Ответил 16/07/2015 в 10:16
источник пользователем

голоса
6

Намного проще решение

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

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
Ответил 04/08/2011 в 12:01
источник пользователем

голоса
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
Ответил 04/12/2010 в 21:57
источник пользователем

голоса
5

Этот пост на форуме описывает , как настроить UIKeyboard , чтобы добавить свой собственный взгляд на клавиатуру.

Ответил 25/02/2009 в 05:48
источник пользователем

голоса
3

СВИФТ 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()
}
Ответил 11/09/2017 в 11:41
источник пользователем

голоса
3

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() 
}
Ответил 19/08/2017 в 11:40
источник пользователем

голоса
2

Я нашел ответ @ user1258240 в быть довольно кратким дано это не так просто , как установление 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)
}
Ответил 04/11/2016 в 05:34
источник пользователем

голоса
2

Если у вас есть несколько числовых полей, я предлагаю подклассы UITextField создать NumericTextField, который всегда отображает цифровую клавиатуру с решенной кнопкой. Затем просто связать свои числовые поля с этим классом в Interface Builder и вам не потребуется никакой дополнительный код в любом из вашего View Controllers. Ниже скоро 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()
    }
}
Ответил 02/10/2016 в 13:07
источник пользователем

голоса
2

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

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

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

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

Ответил 06/05/2015 в 23:46
источник пользователем

голоса
2

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

отклоняя Номер Pad

Нет необходимости в дополнительных делаются кнопки в этом случае.

Ответил 16/05/2013 в 14:50
источник пользователем

голоса
2

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

Создайте DONE кнопку на цифровой клавиатуре IOS UIKeyboard

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

Ответил 04/10/2012 в 08:38
источник пользователем

голоса
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, вы должны быть в состоянии закрыть клавиатуру.

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

Ответил 12/09/2012 в 16:07
источник пользователем

голоса
2

Простейший способ:

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

Ответил 26/06/2012 в 12:44
источник пользователем

голоса
2

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

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

Ответил 23/04/2011 в 22:28
источник пользователем

голоса
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()
}
Ответил 04/05/2016 в 08:23
источник пользователем

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

Ответил 23/08/2016 в 17:09
источник пользователем

голоса
0

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

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

Ответил 07/12/2015 в 09:36
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more