【问题标题】:Setting UITextView Cursor Position设置 UITextView 光标位置
【发布时间】:2021-03-08 18:53:50
【问题描述】:

我有多个 uitextviews 以及它们各自的浅灰色占位符文本 onLoad。代表已正确设置。

我的目标是,在任何uitextview 点击时,如果占位符存在,则将光标选择到uitextview 的开头。

我的问题是,当我最初在占位符文本范围(没有文本的空白区域)之外点击时,textviewdidchangeselection 委托甚至不会触发,并且光标从占位符文本的末尾开始。当我最初点击占位符文本时,一切正常。当我最初点击占位符文本然后尝试在占位符文本范围之外点击时,一切正常。

对它为什么会这样表现有任何想法吗?我尝试了.selectedRange.selectedTextRange 均无济于事。

func onLoad() {
    textView1.text = placeHolderText1
    textView1.textColor = UIColor.lightGray
    
    textView2.text = placeHolderText2
    textView2.textColor = UIColor.lightGray
    
    textView1.textContainerInset.left = 4
    textView1.layer.cornerRadius = 2
    textView1.layer.masksToBounds = true
    textView1.delegate = self
    
    textView2.textContainerInset.left = 4
    textView2.layer.cornerRadius = 2
    textView2.layer.masksToBounds = true
    textView2.delegate = self
}

func textViewDidChangeSelection(_ textView: UITextView) {
    if self.view.window != nil {
        if textView == textView1 {
            if textView.textColor == UIColor.lightGray && textView.text == placeHolderText1 {
                textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
            }
        } else if textView == textView2 {
            if textView.textColor == UIColor.lightGray && textView.text == placeHolderText2 {
                textView.selectedRange = NSMakeRange(0, 0)
            }
        }
    }
}

【问题讨论】:

  • @LeoDabus 我实际上已经尝试从主线程更新,但它并没有解决我遇到的行为......

标签: ios swift uitextview


【解决方案1】:

如果我没记错的话,您的最终目标是拥有一个有效的占位符? 如果是的话,你可以试试这个代码:

//TextView place holder
extension UITextView{
    func setPlaceholder() {
        let placeholderLabel = UILabel()
        placeholderLabel.text = "Enter your hashtags ..."
        placeholderLabel.font = UIFont.italicSystemFont(ofSize: (self.font?.pointSize)!)
        placeholderLabel.sizeToFit()
        placeholderLabel.tag = 222
        placeholderLabel.frame.origin = CGPoint(x: 5, y: (self.font?.pointSize)! / 2)
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.isHidden = !self.text.isEmpty
        self.addSubview(placeholderLabel)
    }

    func checkPlaceholder() {
        let placeholderLabel = self.viewWithTag(222) as! UILabel
        placeholderLabel.isHidden = !self.text.isEmpty
    }
}

在具有 UItextViewDelegate 的 viewController 类中使用此代码:

func textViewDidChange(_ textView: UITextView) {
    textView1.checkPlaceholder()
    textView2.checkPlaceholder()
}

以及您的 viewController 类 viewDidload 中的这段代码:

   textView1.setPlaceholder()
   textView2.setPlaceholder()

【讨论】:

  • 欣赏答案,最终是的,这就是最终目标。只是想知道是否有基于我当前设置的解决方案。
  • 您可以保留您在 func onLoad 中定义的设置和布局。因为这是一个 textView 扩展,所以你需要一个 textview 的占位符就可以了:yourtextView.setPlaceholer
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多