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

时间:2013-06-28 10:31:18

标签: ios keyboard uitextview tableview dismiss

这个问题似乎很多。但我无法让任何解决方案奏效。

我的代码创建了一个tableView个包含不同内容的单元格(基于JSON),用户应该在每个单元格中输入信息。我遇到的问题是,当用户点击单元格外的某个地方时(即在tableView背景上),我希望键盘解除。

didSelectRowAtIndexPath:方法不好。

touchesBegan:根本没有激活(tableView启用了用户互动,但我认为还有其他原因。)

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

我知道resignFirstResponder。但我不知道正在编辑哪个字段。所以我想,我需要采用endEditing:方法。但是当用户触摸到一个单元格外时,我就无法调用它。

任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

如果这是textField,如@JFS所说,您可以设置delegate并在下面的方法中重新签名。

- (BOOL)textFieldShouldReturn:(UITextField *)textField

否则如果是textView,您可以将inputAccessoryView的完成按钮工具栏添加到textView并重新设置textView

我有两个更多想法

糟糕的想法:
    尝试在单元格背景中创建一个不可见的按钮,并添加一个操作方法来重新签名。但是当您使用didSelectRowAtIndexPath:的{​​{1}}方法时,这会让您感到困惑。

好主意:(好的)
    UITableView肯定会有UITableView。因此,在UIScrollview方法中,设置scrollViewDidScroll:肯定会有用。

好主意2     创建新的[self endEditing:YES]View并将其置于所有视图之上,当Button处于编辑状态时,并在用户触摸视图或按钮时调用textView方法

在TABLEVIEW中获取触控功能

其中一些Q& A会帮助你。

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

Why does my UITableView not respond to touchesBegan?

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

答案 1 :(得分:0)

好的,经过大量的游戏,可以想象出来的东西,但这并不好,但是很有效。

表格周围的大多数间隙都被部分标题占用(细胞壁的一小部分)。为了让这些区域调用方法,我在这个节标题中添加了一个手势;

-(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];
}

感谢所有的想法和帮助。

答案 2 :(得分:0)

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

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添加到我的子类化细胞中,但发现这是不够的,在添加这两个东西之后,这是多余的。