【问题标题】:IOS: hide keyboard on touch UITableViewIOS:在触摸 UITableView 时隐藏键盘
【发布时间】:2015-06-25 19:23:06
【问题描述】:

我是 iOS 开发的新手。我想在 UITextView 之外点击时隐藏键盘。 我的 TextView 位于 UITableView 的单元格中。问题是我在顶部有一个工具栏,我的按钮不再反应了。我实现了“shouldReceiveTouch”方法,但我认为我的测试不正确。有任何想法吗?谢谢你,对不起我的英语不好..

在我的 ViewDidLoad 中:

tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];
tap.delegate = self;
[self.view addGestureRecognizer:tap];

注意:点击是一个 UITapGestureRecognizer 属性。

实现的方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
   shouldReceiveTouch:(UITouch *)touch {

    if ([touch.view isKindOfClass:[UIBarButtonItem class]]) {
        return NO;
    }
    return YES;
}

-(void)dismissKeyboard {
    [tview resignFirstResponder];
}

【问题讨论】:

  • 您是否将 tview 委托设置为您的视图控制器? tview.delegate = self 并确保在头文件中实现 UITextViewDelegate
  • 查找 touchesBegan 方法

标签: ios uitextview uigesturerecognizer


【解决方案1】:

UIBarButtonItem 不是 UIView 的子类,因此 shouldReceiveTouch 仍然返回 YES。

当您在 cellForRowAtIndexPath 中初始化单元格时,尝试排除整个 UIToolbar 或仅在 UITableViewCell 中添加点击手势识别器。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
   shouldReceiveTouch:(UITouch *)touch {

    if ([touch.view isKindOfClass:[UIToolbar class]]) {
        return NO;
    }
    return YES;
}

【讨论】:

    【解决方案2】:

    您应该将手势添加到表格视图。

     tap = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(dismissKeyboard)];
        tap.delegate = self;
        [tblView addGestureRecognizer:tap];
    

    【讨论】:

    • 你正在使用gestureRecognizer:gestureRecognizer方法
    • 我的 UIToolBar 是我认为的 UITableView 的一部分。这是它不会改变任何东西的方式。
    【解决方案3】:

    使用 UIScrollView 委托的 didScroll 方法来退出键盘。TableView 也是 UIScrollView 的子类,所以它应该可以工作。

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
         [tview resignFirstResponder];
    }
    

    或者使用这个

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
      [tview resignFirstResponder];
    }
    

    如果你仍然想使用手势然后添加手势到 UIView 或 self.view 或 tableView 的 superView 而不是将其添加到 tableView

    试试下面的代码:----

    保持代码不变并添加此方法

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
         [tview resignFirstResponder];
    }
    

    【讨论】:

    • 这行得通,但这不是我想要的。使用您的解决方案,用户必须滚动而不仅仅是点击。
    • 我认为手势不适用于 UIScrollView 或其子类
    • 我尝试使用 touchesBegan 解决方案,但仍然无法正常工作。它只是从不进入这种方法。我使用了与我的帖子中相同的代码 + 你的 touchesBegan 方法,但我仍然无法使用工具栏中的按钮。谢谢你帮助我。
    • 那么你应该更喜欢 scrollViewWillBeginDraggin。没有其他选择了
    【解决方案4】:

    在 viewDidLoad 中设置 self.view.userInteractionEnabled = yes;

    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
    UITouch *touch = [[event allTouches] anyObject];
    
    if ([touch view] == tview) {
    
        [tview resignFirstResponder];
    
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2011-12-23
      • 2015-04-13
      相关资源
      最近更新 更多