首页 文章

如何在iPhone数字键盘上显示“完成”按钮

提问于
浏览
220

数字键盘上没有“完成”按钮 . 当用户完成在文本字段中输入数字信息时,如何使数字键盘消失?

我可以使用默认键盘获得“完成”按钮,但是用户必须切换到数字键才能输入数字 . 有没有办法在数字键盘上显示“完成”按钮?

21 回答

  • 11

    如果我们只是告诉视图控制器的视图结束编辑,我们也可以使 "user touched somewhere else" 解决方案更简单:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
     { 
          [super touchesBegan:touches withEvent:event];
    
          [self.view endEditing:YES]; //YES ignores any textfield refusal to resign
     }
    

    ...假设“触摸其他地方解除键盘”是视图上任何其他可编辑字段的理想行为 .

  • 4

    Another solution. Perfect if there are other non-number pad text fields on the screen.

    inputAccessoryView

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
        numberToolbar.barStyle = UIBarStyleBlackTranslucent;
        numberToolbar.items = @[[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
                             [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                             [[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)]];
        [numberToolbar sizeToFit];
        numberTextField.inputAccessoryView = numberToolbar;
    }
    
    -(void)cancelNumberPad{
        [numberTextField resignFirstResponder];
        numberTextField.text = @"";
    }
    
    -(void)doneWithNumberPad{
        NSString *numberFromTheKeyboard = numberTextField.text;
        [numberTextField resignFirstResponder];
    }
    
  • 2

    这是对Luda对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()
    }
    
  • 2

    我见过的技巧是制作一个自定义透明按钮,大小与整个视图相同,然后在其click方法中,让文本字段重新签名第一个响应者 . 因此,用户可以单击该字段外的任何位置来关闭键盘 .

  • 47

    UIKeyboardTypeNumberPad and missing return key中的解决方案效果很好,但前提是屏幕上没有其他非数字键盘文本字段 .

    我把这个代码转换成了一个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

    以下是对Luda的回答的改革,其中包括以下变化:

    • 附件视图的大小自动调整为应用程序框架的宽度

    • 避免了不推荐使用的常量 UIBarButtonItemStyleBordered

    • "Done"按钮被实例化为 UIBarButtonSystemItemDone

    目前,“完成”按钮位于附件视图的中心 . 您可以通过删除相关侧的空间将其放置在左侧或右侧 .

    我省略了"Cancel"按钮,因为默认键盘也没有 . 如果你确实想要一个"Cancel"按钮,我建议你将它实例化为 UIBarButtonSystemItemCancel ,并确保你're not discarding the original value in your text field. The 764268 behavior implemented in Luda'的答案,它用空字符串覆盖该值,可能不是你想要的 .

    - (void)viewDidLoad {
      [super viewDidLoad];
      float appWidth = CGRectGetWidth([UIScreen mainScreen].applicationFrame);
      UIToolbar *accessoryView = [[UIToolbar alloc]
                                  initWithFrame:CGRectMake(0, 0, appWidth, 0.1 * appWidth)];
      UIBarButtonItem *space = [[UIBarButtonItem alloc]
                                initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                target:nil
                                action:nil];
      UIBarButtonItem *done = [[UIBarButtonItem alloc]
                               initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                               target:self
                               action:@selector(selectDoneButton)];
      accessoryView.items = @[space, done, space];
      self.valueField.inputAccessoryView = accessoryView;
    }
    
    - (void)selectDoneButton {
      [self.valueField resignFirstResponder];
    }
    

    有关构建附件视图的更多信息,请参阅custom views for data input上的Apple文档 . 您可能还想查阅UIToolbarUIBarButtonItem上的参考页面 .

  • 6

    这是最新的代码 . 只需在viewController中包含#import“UIViewController NumPadReturn.h”即可 .

    这是.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
    
  • 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() 
    }
    
  • 11

    一个更容易的解决方案

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
        [super touchesBegan:touches withEvent:event];
    
        [textViewInstance1 resignFirstResponder];
        [textViewInstance2 resignFirstResponder];
        [textField resignFirstResponder];
    }
    
  • 0

    This forum post描述了如何自定义UIKeyboard以将自定义视图添加到键盘上 .

  • 6

    我发现@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 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 here的一个解决方案,但在键盘出现后,dismiss按钮淡入 . 这并不可怕,但也不理想 .

    在上面链接的问题中描述的解决方案包括一个更优雅的幻觉来消除按钮,在那里我淡出并垂直移动按钮以提供键盘和按钮一起消除的外观 .

  • 1

    simplest 方式是:

    创建 custom transparent button 并将其放在左下角,其中 CGSizeUIKeyboardTypeNumberPad 中的空格相同 . 在按钮单击时分别在textField becomeFirstResponder 上切换(显示/隐藏)此按钮 .

  • 5

    这是我遇到过的最简单的解决方案 . 我从Beginning iOS 5 Development book中学到了这一点 .

    假设number字段被称为 numberField .

    • ViewController 中,添加以下方法:
    -(IBAction)closeKeyboard:(id)sender;
    
    • ViewController.m 中,添加以下代码:
    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
    • 返回 nib 文件 .

    • 打开 Utilities pan .

    • Utilities 下打开 Identity inspector .

    • 单击 View (在nib文件中)一次 . 确保您没有点击视图中的任何项目 . 为了澄清,您应该在 Identity inspectorClass 下看到UIView .

    • 将类从UIView更改为UIControl .

    • 打开 Connection Inspector .

    • 单击并拖动 Touch Down 并将箭头放在 File Owner 图标上 . (仅供参考...文件所有者图标显示在 View 的左侧,并显示为带黄色框的空心立方体 . )

    • 选择方法: closeKeyboard .

    • 运行程序 .

    现在,当您单击 View 背景上的任何位置时,您应该可以关闭键盘 .

    希望这可以帮助您解决问题 . :-)

  • 2

    我修改了Bryan的解决方案,使其更加健壮,因此它可以与可能出现在同一视图中的其他类型的键盘很好地配合 . 它在这里描述:

    Create a DONE button on the iOS numpad UIKeyboard

    我试着在这里解释一下,但是大部分代码都是不容易适应的代码

  • 330

    如果您提前知道要输入的号码数量(例如4位数的PIN码),您可以在4次按键后自动关闭,根据我对此类似问题的回答:

    dismissing Number Pad

    在这种情况下,无需额外的完成按钮 .

  • 2

    如果您有多个数字字段,我建议继承UITextField以创建一个NumericTextField,它始终显示带有完成按钮的数字键盘 . 然后,只需在Interface Builder中将您的数字字段与此类关联,您就不需要在任何View控制器中添加任何其他代码 . 以下是我在Xcode 8.0中使用的Swift 3.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()
        }
    }
    
  • 6

    对于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()
    }
    
  • 2

    关于查找键盘视图和在第3行添加完成按钮的所有实现(这就是为什么button.y = 163 b / c键盘的高度为216)是脆弱的,因为iOS会不断更改视图层次结构 . 例如,以上代码都不适用于iOS9 .

    我认为通过[[[UIApplication sharedApplication] windows] lastObject]找到最顶层的视图更安全,只需添加左下角的按钮,doneButton.frame = CGRectMake(0,SCREEN_HEIGHT-53,106) ,53); //肖像模式

  • 14

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

    然后在viewDidLoad中调用self.view.subviews上的addDoneButtonForTextFields(如果使用表视图,则调用willDisplayCell),将Done按钮添加到所有键盘 .

相关问题