UITextView 无意中添加了新行?

Posted

技术标签:

【中文标题】UITextView 无意中添加了新行?【英文标题】:UITextView adding new line unintentionally? 【发布时间】:2014-01-12 17:26:16 【问题描述】:

我有一个包含 UITextField 和 UITextView 的滚动视图。 UITextField 返回键是“Next”,当按下它时,我调用 [myTextView becomeFirstResponder];一个随机的新行被插入到我的文本视图中,所以我从第二行开始。我该如何避免这种情况?

另外需要注意的是,当我直接点击 UITextView 而不是点击下一个键时,不会发生这种情况。

提前致谢!

【问题讨论】:

如果你分享一些代码,它会让事情变得更好。你确定你没有为 textView.text 属性设置一些东西吗? 这都是在界面生成器中创建的,所以我没有什么要分享的。我的实现文件中目前没有代码 你说你没有代码,但你的问题是你打电话给[myTextView becomeFirstResponder];。这是一个矛盾。你显然有代码。 大声抱歉我的错误我忘记了 textFieldShouldReturn 方法。但至少我知道这是一个 ios 错误。感谢大家的帮助。 【参考方案1】:

解决此问题的一个解决方案是,当您实现textFieldShouldReturn: 委托方法时,请务必返回NO,而不是YES。通过返回 NO,换行符不会传递到文本字段。

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
    // move to next field or whatever you need
    [myTextView becomeFirstResponder];

    return NO;

【讨论】:

两者都有效,今天在这里为每个人点赞怎么样 :) 太棒了!这个真的好用!谢谢! textFieldShouldReturn YES 实际上传递了换行符。没有,它不会。【参考方案2】:

好的,这个行为是由于 iOS 中的一个错误,当使用下一个按钮在同一个运行循环中成为第一响应者时。要克服这个问题,您应该手动执行此操作。 首先从 textFied 中退出第一响应者,然后将 textView 设为第一响应者。像这样。实现这个委托方法。

- (BOOL)textFieldShouldReturn:(UITextField *)textField

    [textField resignFirstResponder];
    [textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
    return YES;

【讨论】:

没有必要这样做。看我的回答。 两者都有效,今天在这里为每个人点赞怎么样 :) 为什么要先辞去textField 上的第一响应者?为什么不直接在textView 上拨打延迟的becomeFirstResponder【参考方案3】:

performSelector 类似的想法,但使用异步调度队列(Swift 4 版本):

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
   textField.resignFirstResponder()
   DispatchQueue.main.async 
      self.myTextView.becomeFirstResponder()
   
   return true

【讨论】:

以上是关于UITextView 无意中添加了新行?的主要内容,如果未能解决你的问题,请参考以下文章

当移动到嵌入在 UITableViewCell 中的 UITextView 中的新行时,光标消失

在启用滚动的堆栈视图中扩展 UITextView

使用自动布局问题在 UIScrollView 中调整 UITextView 的大小

当用户输入 29 个字符时,将 UITextView 插入符号移动到新行?

UITextView 在 UITableViewCell 内使用新行自动增长

UITextView insertText 调用 shouldChangeTextInRange: replacementText: