繁体   English   中英

UITextView无法在以编程方式创建的UITableView中关闭键盘

[英]UITextView can't dismiss the keyboard in programmatically-created UITableView

在这个问题上似乎有很多。 但是我无法获得任何有效的解决方案。

我的代码创建了一个tableView充满了不同内容的单元格(基于JSON),用户应在每个单元格中输入信息。 我遇到的问题是,当用户点击单元格外部的某个位置(即tableView背景)时,我希望键盘关闭。

didSelectRowAtIndexPath:方法不好。

touchesBegan:完全不会触发( tableView启用了用户交互,但是我认为还有其他原因)。

我已经向tableView添加了一个手势,但是后来我无法开始编辑。

我知道resignFirstResponder 但是我不知道正在编辑哪个字段。 所以我认为,我需要使用endEditing:方法。 但是当用户在单元格外部触摸时,我只是无法调用它。

任何帮助,将不胜感激。

如果这是@JFS所说的textField ,则可以在下面的此方法中设置delegate并将其签名。

- (BOOL)textFieldShouldReturn:(UITextField *)textField

否则,如果这是一个textView ,你可以完成按钮的添加工具栏inputAccessoryViewtextView和辞职您textView

我还有两个想法

馊主意:
尝试在单元格背景中创建一个不可见的按钮,并添加一个操作方法以将其辞职。 但这在您使用UITableView didSelectRowAtIndexPath:方法时会感到困惑。

好主意:(好主意)
UITableView当然将具有UIScrollview 因此,在scrollViewDidScroll:方法中,设置[self endEditing:YES]肯定可以工作。

好点子2创建一个新的ViewButton ,并将其放置的所有意见,顶部当textView是在编辑和调用endEditing:方法当用户触摸视图或按钮。

在TABLEVIEW中获取触摸检测:

这些常见问答会为您提供帮助。

https://stackoverflow.com/a/8787019/1083859

为什么我的UITableView不响应touchesBegan?

https://stackoverflow.com/a/8786706/1083859

好吧,经过大量的尝试设法弄清楚了(某物)之后,它不是很好,但是可以工作。

表格周围的大多数空隙都由节标题(小部分由单元格壁占据)弥补。 为了使这些区域能够调用方法,我向部分标题添加了一个手势,如下所示:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    NSString *sectionTitle = [self tableView:tableView titleForHeaderInSection:section];
    if (sectionTitle == nil)
    {
        return nil;
    }

    UILabel *label = [[UILabel alloc] init];
    label.frame = CGRectMake(20, 8, 320, 20);
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor colorWithRed:76/255.0 green:86/255.0 blue:108/255.0 alpha:255/255.0];
    label.shadowColor = [UIColor grayColor];
    label.shadowOffset = CGSizeMake(-0.0, 0.0);
    label.font = [UIFont boldSystemFontOfSize:16];
    label.text = sectionTitle;

    UIView *view = [[UIView alloc] init];
    [view addSubview:label];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(eventMenuTap)];
    [view addGestureRecognizer:singleTap];

    return view;
}

这也使我能够自定义每个部分的标签。 最终结果是,当滚动表时,如果在单元格(即标题)之外的任何地方(几乎)单击了任何地方,则我将关闭键盘,然后将调用eventMenuTap。

-(void)eventMenuTap
{
    NSLog(@"Tap has begun...");
    [self.view endEditing:YES];
}

感谢您的所有想法并为此提供帮助。

对于任何路人,我发现的最简单,最有效的解决方案需要两件事:

1:子类化表视图,并将以下内容添加到其.m中:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // send your own dismiss message; you can use self.delegate to refer to TV's TVC...
    [((SearchVC *)((UITableViewController *)self.delegate).parentViewController).searchBar resignFirstResponder]; 

    // crucial!
    [super touchesBegan:touches withEvent:event];
}

2:将以下内容添加到TVC:

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    // send your own dismiss message...
    [((SearchVC *)self.parentViewController).searchBar resignFirstResponder];
}

这对我来说效果很好。 我最初尝试将touchesBegan添加到我的子类化单元中,但是发现这是不够的,并且在添加了这两项之后,就显得多余了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM