0

我有一个 UITextView 使用下面的方法在 viewDidLoad 上以编程方式创建。[_answerTextView becomeFirstResponder]调用后立即成功显示键盘 。如果用户输入 return(\n) 字符,则隐藏。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]) {
        [self endEditing:YES];
        return NO;
    }
    return YES;
} 

键盘被上面的代码隐藏后,我无法再通过再次点击 UITextView 来恢复它。

我尝试通过调用[_answerTextView becomeFirstResponder]父 UIView 的 Tap 事件来显示键盘,它起作用了。但这不是我想要的。

UITextView 是通过下面的方法创建的;

-(UITextView*)createSurveyTextView{
    _answerTextView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, _optionsStackView.frame.size.width, 200)];
    _answerTextView.keyboardType = UIKeyboardTypeDefault;
    _answerTextView.text = @"";
    _answerTextView.editable = true;
    _answerTextView.selectable = true;
    _answerTextView.delegate = self;
    [_answerTextView becomeFirstResponder];

    _answerTextView.backgroundColor = [UIColor whiteColor];
    _answerTextView.textColor = [UIColor blackColor];
    _answerTextView.layer.cornerRadius = 5;
    [_optionsStackView addSubview:_answerTextView];

    _answerTextView.font = [UIFont systemFontOfSize:20];
    [_answerTextView setReturnKeyType:UIReturnKeyDone];
    [_optionsStackView bringSubviewToFront:_answerTextView];
    [self bringSubviewToFront:_answerTextView];
    [_answerTextView setUserInteractionEnabled:true];

    UITapGestureRecognizer *mainViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextViewTap:)];

    UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap2:)];

    [_answerTextView addGestureRecognizer:mainViewTap];
    [self addGestureRecognizer:tap2];

    return _answerTextView;
}

我希望 UITextView 在用户自己点击它时简单地显示键盘。我错过了什么?

编辑:我在另一个视图中有相同的来源,但那里一切正常。唯一的区别是,这里的 UITextView 是以编程方式创建的。

编辑2:我得到了它的工作。_optionsStackViewUITextView 添加为子项的是 UIStackView 。我尝试将其添加_answerTextView到父 UIView,现在一切正常。UIStackView 会有什么问题?

4

3 回答 3

0

你的问题在你的代码中很奇怪。你可以解释为什么对这个 UITextView 控件使用 UITapGestureRecognizer。你认为这会导致冲突吗?

我从一开始就发现了你的问题,但是我创建了新项目来确保。所以我确认 UITextView 本身已经有了目标。而且你不能添加 UITapGestureRecognizer。

于 2019-08-26T01:52:30.990 回答
0

您没有使用常用方法来隐藏/关闭键盘。

试试这个常用的方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return [textField resignFirstResponder];
}

这是 UITextFieldDelegate 中的一个方法,使用它并删除您的代码:

if([text isEqualToString:@"\n"]) {
        [self endEditing:YES];
        return NO;
}

编辑:@siburb 你是对的。我的错。UITapGestureRecognizer 可能是根本原因。

编辑:@Semih Akbas

替换:[_optionsStackView addSubview:_answerTextView];

收件人:[_optionsStackView addArrangedSubview:_answerTextView];

于 2019-08-26T04:20:44.527 回答
0

您所做的几乎是正确的,但只需尝试更改endEditing:[textView resignFirstResponder]

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
} 

如果这不起作用,那么可能是您的一个手势正在阻止UITextView自己UITapGestureRecognizer的用户接收点击。尝试禁用(或注释掉)两个识别器的创建,以验证这是问题所在。如果是,那么您可以使用这些UIGestureRecognizerDelegate方法修复它。

于 2019-08-26T04:25:28.117 回答