我花了很多时间试图解决这个简单的问题,但没有管理它。我想在UITextView中使用占位符:“翻译”,当点击UITextView占位符应该留在那里,直到一个字符被输入,但我需要光标被放置在占位符的开头就在“翻译”字,但它留在我的占位符的结尾.我找到几个答案,并试图这样做,但不工作.占位符正确更改为黑色,但第二个命令-〉textView.selectedRange =NSMakeRange(0,0)没有将光标移动到开始处,为什么?
- 我用以下代码替换了这一行NSMakeRange(我读到的其他建议,但结果相同,不起作用)-〉textView.selectedTextRange = textView.textRange(from:textView.beginningOfDocument,用于:textView.beginningOfDocument)
下面是完整的代码:
class MainViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {
@IBOutlet weak var definitionField: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// setting placeholder
definitionField.textColor = .gray
definitionField.text = "translation"
definitionField.delegate = self }
func textViewDidBeginEditing(_ textView: UITextView) {
if (textView.text == "translation") {
textView.textColor = .black
textView.selectedRange = NSMakeRange(0, 0)
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if (textView.text == "") {
textView.text = "translation"
textView.textColor = .gray
}
textView.resignFirstResponder()
}
2条答案
按热度按时间lskq00tm1#
在
textViewDidBeginEditing
和becomeFirstResponder
被调用之后,系统似乎自动设置了selectedTextRange
。您可以通过使用自定义UITextView
子类并重写来观察这一点:您将看到,由于您的代码,它首先被设置为
(0, 0)
,然后didSet
被再次“神奇地”调用,将selectedTextRange
设置为(11, 0)
。我不确定是哪个方法调用了这个函数,甚至可能没有一个可重写的方法在那之后被调用。
一个简单的解决方案是使用
DispatchQueue.main.async
来等待将所选文本范围设置到末尾的任何内容,然后 * 更改选择。光标将在结束时出现一小会儿,然后再转到开始。这似乎只是视觉上的。当我试图在光标位于结束时输入文本时,文本被插入到“翻译”之前。
也就是说,这个占位符的实现似乎与人们期望的占位符的工作方式(如
UITextField
中的占位符)有很大的不同,特别是当textViewDidEndEditing
时。如果你想要类似于
UITextField
的行为,或者想看看其他方法,请查看this post。7d7tgy0s2#
这里最简单的解决方案是添加一个包含占位符的标签。然后根据文本视图中是否有任何文本来设置其
isHidden
属性。Here is a working example,但它使用RxSwift来跟踪文本、颜色和字体的变化。
它的作用:
1.创建一个标签并将其嵌入到文本视图的适当位置。
1.监视文本视图的tintColor并更新标签的textColor。
1.监视文本视图的字体并更新标签的字体。
1.监视文本视图的文本,并根据是否存在任何文本更新标签的isHidden属性。