【问题标题】:Hiding the keyboard when UITextField loses focus当 UITextField 失去焦点时隐藏键盘
【发布时间】:2010-07-26 21:00:04
【问题描述】:

我已经看到一些关于如何在 UITextField 失去焦点时关闭键盘的线程,但它对我不起作用,我不知道如何。以下代码中的“touchesBegan:withEvent:”永远不会被调用。为什么?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if ([self.textFieldOnFocus isFirstResponder] && [touch view] != self.textFieldOnFocus) {
        [textFieldOnFocus resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

P.S.:此代码已插入到具有 UITableView 的视图控制器中。 UITextField 位于此表的一个单元格中。

所以,我的看法是:这个方法没有被调用,因为触摸发生在我的 ViewController 的 UITableView 上。所以,我认为,我应该将 UITableView 子类化,才能使用我在其他线程上看到的这种方法,但它可能有更简单的方法。

你能帮帮我吗?非常感谢!

【问题讨论】:

    标签: iphone focus uitextfield


    【解决方案1】:

    确保在 IB 中将 UITextFielddelegate 设置为 First Responder。我只是在屏幕上放置了一个自定义(不可见)UIButton,并设置了一个IBAction 来隐藏键盘。例如:

    - (IBAction)hideKeyboard {
        [someTextField resignFirstResponder];
    }
    

    将其连接到UIButton

    【讨论】:

      【解决方案2】:

      这是我的解决方案,在某种程度上受到 SO 中几篇文章的启发:只需在视图的上下文中处理点击手势,用户“显然”试图离开 UITextField 的焦点。

      -(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture
      {
          [self endEditing:YES];
      }
      

      这是在 ViewController 中实现的。该处理程序作为手势识别器添加到 View 属性的 setter 中的适当 View:

      -(void) setLoginView:(LoginView *)loginView
      {
          _loginView = loginView;
      
          UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];    
      
          [tapRecognizer setDelegate:self];  // self implements the UIGestureRecognizerDelegate protocol
      
          [self.loginView addGestureRecognizer:tapRecognizer];    
      }
      

      也可以在视图中定义处理程序。如果您不熟悉处理手势,请参阅 Apple 的文档,其中有大量示例。

      我应该提到,您将需要一些额外的代码来确保其他控件被点击,您需要一个实现 UIGestureRecognizerDelegate 协议的委托和此方法:

      - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
      {    
          if ([touch.view isKindOfClass:[UIButton class]])    // Customize appropriately.
              return NO; // Don't let the custom gestureRecognizer handle the touch   
      
          return YES;
      }
      

      【讨论】:

        【解决方案3】:
        -(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event
         {
            for (UIView* view in self.view.subviews) 
            {
                if ([view isKindOfClass:[UITextField class]])
                [view resignFirstResponder];
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多