2009-02-25 5 views
205

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

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

ответ

320

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

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

+0

Если есть несколько текстовых полей, как определить, какой UITextField редактируется? – Nate

13

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

+3

Я сделал это в дополнение к Ключу возврата. Это делает гораздо более удобное приложение. Мне нравится давать как ключи возврата, так и методы возврата в любом месте. – IcyBlueRose

+3

теперь, когда у нас есть UIGestureRecognizers, просто настройте распознаватель жестов в главном представлении viewcontroller и попросите его отправить endEditing: YES к его представлению. Это закроет клавиатуру для каждого текстового поля, которое клавиатура может обслуживать, при касании вне клавиатуры. – chadbag

5

This forum post описывает, как настроить UIKeyboard, чтобы добавить пользовательский вид на клавиатуру.

10

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

Я взял этот код и превратил его в 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 

Наслаждайтесь.

+2

Ссылка на исходное решение теперь перенаправляется на http://www.neoos.ch/ –

6

Последний код. Просто укажите #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 
+0

, похоже, это работает на симуляторе, но на устройстве ... я также не вижу кнопку DONE, и ничего не происходит, когда я нажимаю пустой пространство ... любая идея? – xoail

+14

Ничего себе, пожалуйста, не используйте этот код. Вы перепробовали методы класса из одной категории, что приведет к игнорированию «реального» viewDidLoad и т. Д. Из вашего класса UIViewController. –

2

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

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

6

Гораздо проще решение

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

    [textViewInstance1 resignFirstResponder]; 
    [textViewInstance2 resignFirstResponder]; 
    [textField resignFirstResponder]; 
} 
2

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

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

2

Вот самое простое решение, которое я сталкивался. Я узнал об этом из книги разработки iOS 5 Development.

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

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

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

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

  4. Открыть Utilities pan.
  5. Открыть Identity inspector под Utilities pan.
  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

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

Create a DONE button on the iOS numpad UIKeyboard

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

+0

Это было лучшее решение, которое я нашел для XCode 4.5, и он работает с iOS 6.0. Он добавляет кнопку DONE на цифровую клавиатуру. Перейти к исходному сообщению, чтобы получить изображение кнопки DONE. http://www.neoos.ch/blog/37-uikeyboardtypenumberpad-and-the-missing-return-key – birdman

+0

спасибо! рад, что это тебе помогло! – horseshoe7

2

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

dismissing Number Pad

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

36

Вот приспособление для ответа Люда для 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 (не стесняйтесь выбирать другие имена, просто измените имена селекторов в ViewDidLoad соответственно

func boopla() { 
    textField.resignFirstResponder() 
} 

func hoopla() { 
    textField.text="" 
    textField.resignFirstResponder() 
} 
+0

Действительно полезный до даты ответ – MikeJ

+1

'UIBarButtonItemStyle.Bordered' устарел с iOS 8.0. Вместо этого предлагается использовать UIBarButtonItemStyle.Plain'. – Jonny

+0

Селекторы должны быть обновлены до: #selector (YourViewController.boopla) –

2

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

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

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

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

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, на custom views for data input. Вы, вероятно, захотите ознакомиться со справочными страницами на UIToolbar и UIBarButtonItem.

+0

'[UIScreen mainScreen] .applicationFrame' устарел в iOS 9. Используйте' [UIScreen mainScreen] .bounds' –

0

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

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

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

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

2

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

Я предпочитаю решение вашего подкласса. – AechoLiu

2

Я нашел @user1258240's 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) 
} 
+0

также работает для SWIFT 4 – richc

3

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

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

Пример использования с помощью пользовательских Совершено действий:

// 
// MyViewController.swift 
// 

@IBOutlet weak var myNumericTextField: UITextField! { 
    didSet { 
     myNumericTextField?.addDoneCancelToolbar(onDone: (target: self, action: #selector(doneButtonTappedForMyNumericTextField))) 
    } 
} 

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
} 
2

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() 
} 
Смежные вопросы