【问题标题】:Hide keyboard when losing focus off UISearchBar在 UISearchBar 失去焦点时隐藏键盘
【发布时间】:2009-05-20 14:31:04
【问题描述】:

我不知道为什么这么难。我的页面顶部有一个 UISearchBar。当用户输入该 UISearchBar 时,它会自动过滤搜索栏下方的 UITableView 中的结果。不需要搜索按钮,因为我在按下键时进行搜索。

应用程序的流程是用户在搜索栏中键入搜索(显示键盘),然后在表格视图中滚动结果 - 此时键盘需要消失。

我很难让键盘消失。

我知道我需要这样做:

    [searchBar resignFirstResponder];

让键盘消失,但我找不到我需要执行此操作的委托。我想在用户触摸表格视图时立即执行此操作。

有什么想法吗?

【问题讨论】:

标签: iphone cocoa-touch


【解决方案1】:

试试这个:

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [searchBar resignFirstResponder];

}

它对我有用

【讨论】:

    【解决方案2】:

    我认为最简单(也是最好)的方法是对全局视图进行子类化并使用 hitTest:withEvent 方法来监听任何触摸。键盘上的触摸未注册,因此仅当您触摸/滚动/滑动/捏...其他地方时才会调用 hitTest:withEvent,然后调用 [self endEditing:YES]。

    这比使用 touchesBegan 更好,因为如果您单击视图顶部的按钮,则不会调用 touchesBegan。它也比使用暗屏更好,因为在复杂和动态的用户界面中,你不能把暗屏放在任何地方。此外,它比调用 [searchBar resignFirstResponder] 更好,因为屏幕上可能有很多文本字段,所以这适用于所有文本字段。

    【讨论】:

      【解决方案3】:

      您可能想像 Cydia(越狱包装 UI)那样做 - 有一个搜索按钮,当您按下搜索按钮时,它会关闭键盘。在您为预览键入内容时,结果仍会被过滤。

      【讨论】:

      • 这将需要按下搜索按钮来移除键盘——我觉得这个步骤应该是不必要的,并且可能只会让用户感到沮丧。不过还是谢谢。
      【解决方案4】:

      由于结果将显示在表格视图中,请使用 UIScrollView 的委托(UITableView 响应)方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView

      您需要让视图控制器响应UITableView 的数据源和委托(在.h 文件中):

      <UITableViewDataSource, UITableViewDelegate>
      

      比在.m文件中添加你的初始化方法:

      self.tableView.dataSource = self;
      self.tableView.delegate = self;
      

      最后,添加这个方法:

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
          [self.view endEditing:YES];
      }
      

      这将使UISearchBar失去焦点,键盘将隐藏。

      【讨论】:

        【解决方案5】:

        一种可能性是 UISearchBar 属于一个控制器,它显示在 UIModalPresentationFormSheet 中。 我遇到了同样的问题,发现这与UIViewController的“disablesAutomaticKeyboardDismissal”方法有关。

        Apple documentation 声明如下:

        在子类中重写此方法以允许或禁止解雇 更改时的当前输入视图(通常是系统键盘) 从需要输入视图的控件到不需要的控件。在下面 正常情况下,当用户点击需要 输入视图,系统自动显示该视图。敲入一个 不想要输入视图的控件随后会导致 当前输入视图将被关闭,但可能并非在所有情况下。你可以 在那些突出的情况下覆盖此方法以允许输入 视图被关闭或使用此方法防止视图被关闭 在其他情况下被解雇。

        该方法的默认实现在modal时返回YES 视图控制器的表示样式设置为 UIModalPresentationFormSheet 并为其他演示文稿返回 NO 样式。因此,系统通常不允许键盘 因模态形式而被解雇。

        在我的例子中,我在导航栏中显示了搜索栏,因此我必须创建一个 UINavigationViewController 的子类来覆盖该方法,如下所示:

        - (BOOL)disablesAutomaticKeyboardDismissal {
            return NO;
        }
        

        在那之后 resignFirstResponder 最终会让键盘消失。

        【讨论】:

          【解决方案6】:

          回答可能太晚了,但这可能对将来的任何人都有帮助。这段特殊的代码对我有用。附言我不拥有这个解决方案,前段时间在网上找到的。

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

          【讨论】:

            【解决方案7】:

            给定一个带有searchBar 变量的视图,将此方法添加到视图中:

            override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
            {
                if searchBar.isFirstResponder && !searchBar.point(inside: point, with: event){
                    searchBar.resignFirstResponder()
                }
                return super.hitTest(point, with: event)
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-31
              • 1970-01-01
              • 2022-11-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多