【问题标题】:resignFirstResponder with Text Field is not working带有文本字段的 resignFirstResponder 不起作用
【发布时间】:2017-04-10 07:12:00
【问题描述】:

我有四个 UITextField,每个都与 .h 文件中的一个出口相关联。我还为每个文本字段定义了 4 个关闭函数,如下所示:

- (IBAction)dismiss1:(id)sender;
- (IBAction)dismiss2:(id)sender;
- (IBAction)dismiss3:(id)sender;
- (IBAction)dismiss4:(id)sender;

@property (strong, nonatomic) IBOutlet UITextField *name;
@property (strong, nonatomic) IBOutlet UITextField *email;
@property (strong, nonatomic) IBOutlet UITextField *weight;
@property (strong, nonatomic) IBOutlet UITextField *age;

.m文件中dismiss函数的实现:

- (IBAction)dismiss1:(id)sender {
[sender resignFirstResponder];
}

- (IBAction)dismiss2:(id)sender {
[sender resignFirstResponder];
}

...

我非常确定插座已正确连接到每个 UITextFiled。每个dismiss函数的IBAction也对应着'Editing did end'事件。但是,当我使用模拟器运行应用程序时,当我单击“Enter/Done”时键盘不会关闭。也很奇怪,当我将断点放在关闭函数中时,在输入相应的 UITextField 时单击“Enter”并不会调出调试器。

非常感谢您的帮助!

更新:我使用断点检查了发送者 (dismiss1) 的对象类型,它是 UITextFiled。但是,当我在第一个 TextField 中单击“Enter”时,我没有进入调试模式,而是在单击第二个 TextField 时(在键入之前)进入了调试模式。

【问题讨论】:

  • 将您的发件人对象转换为 UITextField 对象,然后重试。
  • 您是否在 Storyboard 中设置了 UITextfields 委派您的控制器? “编辑结束”不需要IBAction方法,你可以只声明方法并在情节提要中连接“编辑结束”并在执行中编写resignFirstResponder
  • 尝试在您的解除方法中使用断点并检查发件人的类型。也使用 [self.view endEditing:YES];在您的解雇方法中。

标签: ios objective-c uitextfield


【解决方案1】:

设置UITextFielDelegate

textfieldname.delegate = self;

使用此代码将解决您的问题

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{

   [textField resignFirstResponder];
   return YES;

}

【讨论】:

  • 我看不出这段代码是如何工作的,所有的 if 语句似乎都在做同样的事情。
  • 为什么需要 if-else 语句? :/ 无论文本字段是什么实例,您都在做同样的事情。只需辞职并返回是
【解决方案2】:

使用代码退出keyBoard而不指定textFiled名称。

- (IBAction)dismiss1:(UITextField*)sender {
  [self.view endEditing:true];
  // or use [sender resignFirstResponder];
}

【讨论】:

  • 检查您的对象类型
  • @WenjunWu - 你在 UIVIew 或 UIscrollview 下的文本字段
  • @Wenjun Wu.dismiss1 连接到IBOutlet。
  • @Anbu.Karthik 我的文本字段位于 UI 表视图中。这重要吗?
  • @WenjunWu - 是的,是prboem,将辞职更改为[[self yourtableViewName] endEditing:YES],更多信息请参见stackoverflow.com/questions/8248477/…
【解决方案3】:

添加文本字段委托

name.delegate = self;
email.delegate = self;

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
  [textField resignFirstResponder];
   return YES;
}

【讨论】:

    【解决方案4】:

    无需为文本字段创建四个操作

    您可以设置Textfield的委托并使用以下方法

    - (void)textFieldDidEndEditing:(UITextField *)textField
    

    在此方法中,您可以将您的文本字段与返回文本字段的方法进行比较,并让您在“if”条件下完成任务

    希望对你有帮助!!

    【讨论】:

      【解决方案5】:

      将标签分配给不同的文本字段 然后 >

      textfield.delegate = self;
      
      -(BOOL)textFieldShouldReturn:(UITextField *)textField
      {
      if(textfield.tag==num)
      {
        [textField resignFirstResponder];
      
      }
         return YES;
      }
      

      【讨论】:

        【解决方案6】:

        Editing did end 在文本字段确实失去“焦点”时被调用,这意味着它不再是第一响应者(因为它已经辞职或其他人成为第一响应者)。

        使用textFieldShouldReturn 来检测何时调用了返回键。

        并在调用时在 texfield 上调用 resignFirstResponder。之后将发生Editing did end 事件。

        编辑:你必须实现一些东西(你的 ViewController?)作为文本字段的委托。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-07
          • 2015-08-24
          • 1970-01-01
          • 2011-02-08
          • 2013-09-24
          • 2018-06-06
          相关资源
          最近更新 更多