在多个 UITextField 的数字键盘上显示完成按钮

Posted

技术标签:

【中文标题】在多个 UITextField 的数字键盘上显示完成按钮【英文标题】:show Done button on number pad for multiple UITextFields 【发布时间】:2014-08-25 19:04:22 【问题描述】:

@Luda's answer is a great answer,但是当我需要将它用于多个文本字段时我被卡住了,所以我将其编辑如下:

首先,我为每个文本字段获取 IBOutlets,例如:textField1、textField2

然后我将代码编辑为

- (void)viewDidLoad

    [super viewDidLoad];

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    numberToolbar.barStyle = UIBarStyleBlackTranslucent;
    numberToolbar.items = [NSArray arrayWithObjects:
                         [[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(sendToServer:)],
                     nil];
    [numberToolbar sizeToFit];
    textField1.inputAccessoryView = numberToolbar;
    textField2.inputAccessoryView = numberToolbar;


-(void)cancelNumberPad:(UITextField *)textField

   //here I use if/else to determine which textField was tapped
   if(textField == self.textField1)
   
      //do some stuff
   else //...



-(void) sendToServer:(UITextField *)textField

    //here I use if/else to determine which textField was tapped
   if(textField == self.textField1)
   
      //do some stuff
   else //...

请注意,我必须将冒号 : 添加到 @selector,例如@selector(sendToServer:) 这样就可以将正确的 TextField 作为参数传递。

但是

它不工作。测试失败:if(textField == self.textField1)。那么有人知道如何正确执行此操作吗?

问题是:我如何知道正在编辑哪个文本字段?

【问题讨论】:

我希望得到比***.com/questions/1823317/… 更直接的答案。直接指的是选择器的参数。 【参考方案1】:

检查if (textField == self.textField) 失败的原因是默认传递给 UIBarButtonItem 选择器的参数实际上是 UIBarButtonItem 本身。您可以通过在任一选择器方法中放置断点并检查 textField 参数来验证这一点。

一种可能的解决方案是,在不引入任何代码来循环子视图的情况下,将您的视图控制器声明为 UITextFieldDelegate,然后按如下方式修改您的选择器:

- (void)sendToServer:(UIBarButtonItem*)barButtonItem 
    [self.view endEditing:NO];

然后实现委托方法textFieldShouldEndEditing:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField

    // here you would determine which text field the UIBarButtonItem was associated with
   if(textField == self.textField1)
   
       // your code here
       // and then, if you wanted to dismiss the keyboard
       return YES;
    else 
       return NO;
   

【讨论】:

【参考方案2】:

尝试使用标签 像这样:

textFiled1.tag = 1;
textFiled2.tag = 2;

//当您的文本字段开始编辑时,将调用此方法。

- (void)textFieldDidBeginEditing:(UITextField *)textField



NSLog(@"tag ==%d",textField.tag);
if(textField.tag == 1)
   //do sth
  


顺便说一句,你应该在你的 XX.h 文件中声明 UITextFieldDelegate

【讨论】:

以上是关于在多个 UITextField 的数字键盘上显示完成按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 上默认显示数字键盘?

如何限制 UITextField 在 Swift 中只接受数字?

为多个 UITextField 使用 inputAccessoryView UIToolbar

UITextField 的标签在其键盘设置为数字键盘时重置?

UITextField 提示时键盘不显示

如何使键盘 UITextField 中的数字视图成为默认值?