TextView在iOS中按下“完成”键时无法解除键盘

5

我有一个TextView,当我按下"完成"按钮时,TextView会开始新的一行。

我已经实现了这些方法并添加了所有委托。

@property (nonatomic, strong) IBOutlet UITextView *textField;

-(void)textViewDidEndEditing:(UITextView *)textView //was UITextField
{
    [self.textField resignFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextView *)textField{

    [textField resignFirstResponder];
    return YES;

}

我在属性检查器中将键盘返回键设置为“完成”。 我希望键盘上的完成键能够取消第一响应者,但似乎没有起作用。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

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

    // error thrown here saying code will never execute
    if(range.length + range.location > textField.text.length)
{
    return NO;
}

NSUInteger newLength = [textField.text length] + [string length] - range.length;
return newLength <= 300;
}

如何将这两个语句结合起来,使其能够正常工作而不出错?

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rmaddy
@rmaddy 好的,如果我删除那些resignfirstredponder方法,它会工作吗? - smithyy
仅从 textViewDidEndEditing: 方法中删除对 resignFirstResponder 的调用。顺便说一下,您发布了一个 UITextView 的委托方法和另一个 UITextField 的委托方法。您到底使用哪个?textFieldShouldReturn: 方法不会与 UITextView 一起使用。它是为 UITextField 设计的。巨大的区别。 - rmaddy
@rmaddy 我正在使用UITextView,我会更改它并删除textvoewdidendediting方法,谢谢。 - smithyy
请注意,与文本字段不同,文本视图没有委托方法来处理返回键。原因很简单-在文本视图中,返回键通常除了将文本放在下一行之外没有特殊含义。将“返回”键标记为“完成”对于文本视图毫无意义。如果您只想允许用户输入一行文本,请使用文本字段而不是文本视图。 - rmaddy
  • (BOOL)textViewShouldReturn:(UITextView *)textField{ // 我的textView叫做textField [textField resignFirstResponder]; return YES;
} 这是我所有的内容,但它仍然无效。
- smithyy
2个回答

3

添加代理 UITextViewDelegate

@property (nonatomic, strong) IBOutlet UITextView *textField;

将这行代码写在viewDidLoad方法中

textField.delegte = self;

// 在下面添加委托方法 [代码为Swift。请查找obj-c方法并编写逻辑,因为我已经有了]

// 请提供更多上下文信息以便进行精确定位和翻译
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    if (textField.text.length >= 300) {
        return NO;
    }
    return YES;
}

还没有,我已经有一个限制字符的方法,所以当我添加你的方法时,它会显示代码无法执行。 - smithyy
我在这个方法中有两个语句,你的语句和一个字符限制语句。它说你的语句不会执行。你能告诉我如何在这个方法中放置两个语句吗? - smithyy
一个基本的事情 -> 在任何返回方法中,return语句后面不会执行任何语句。(好的亲爱的) - Chetan Prajapati
因为我想限制字符,我是iOS新手,所以有没有办法可以同时添加它们? - smithyy
而对于返回键来说,它需要先放弃第一响应者的身份。 - smithyy
显示剩余4条评论

2

前往您的故事板,然后选择文本字段并设置代理,还需在.h文件中确认UITextFieldDelegate协议。

希望这有所帮助。


我该如何在Storyboard中设置代理? - smithyy
右键单击文本字段,有一个选项委托点击圆圈,然后转到文件所有者离开鼠标点击。 - Pradumna Patil
你可以在.h文件中的@interface处完成它。它应该看起来像这样:@interface YourViewController : UIViewController <UITextFieldDelegate>。完成后即可。 - Adrian
@AdrianB 我有一个 UITextView,所以它显示 uitextviewdelegate,但当我按下 Done 按钮时键盘仍然不消失,只是开始了新的一行。 - smithyy
textField.returnKeyType = UIReturnKeyDone - Pradumna Patil
我在属性检查器中指定了返回键,因此我没有将其放入代码中。 - smithyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接