gpt4 book ai didi

ios - 具有存储属性的扩展

转载 作者:行者123 更新时间:2023-11-28 10:55:07 28 4
gpt4 key购买 nike

我仍在学习 Swift,我正在尝试创建一个扩展以将占位符添加到 UITextView。

我的想法是创建 2 个 UITextView,一个以文本作为占位符,当用户开始编辑文本时,它实际上是隐藏的,用户正在修改另一个 UITextView。

但是,我的问题不是在 UITextView 中有一个占位符,而是关于如何使用扩展来解决这个问题。
我的问题是,我必须在我的实现中更改什么才能创建一个从调用方看来如下的扩展:
myTextView.placeholder("占位符文本..")

到目前为止,我已经在我的 UIViewController 中创建了它,并且需要将它移动到一个扩展中,但是我有很多存储的属性,所以它不起作用。

这是我的代码:

import UIKit

class ViewController: UIViewController, UITextViewDelegate {


let myTextView: UITextView = {
let textView = UITextView()
textView.tag = 0
textView.backgroundColor = UIColor.yellow
textView.layer.cornerRadius = 8
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()

let textViewPlaceHolder: UITextView = {
let textViewPlaceHolder = UITextView()
textViewPlaceHolder.tag = 1
textViewPlaceHolder.text = "Placeholder text.."
textViewPlaceHolder.textColor = UIColor.lightGray
textViewPlaceHolder.backgroundColor = UIColor.clear
textViewPlaceHolder.translatesAutoresizingMaskIntoConstraints = false
return textViewPlaceHolder
}()


func textViewDidChange(_ textView: UITextView) {
myTextView.becomeFirstResponder()
if textView.tag == 1 && (myTextView.text != nil || myTextView.text != "") {
textView.isHidden = true
textViewPlaceHolder.resignFirstResponder()
} else if textView.tag == 0 {
if myTextView.text == nil || myTextView.text == "" {
textViewPlaceHolder.becomeFirstResponder()
myTextView.resignFirstResponder()
textViewPlaceHolder.isHidden = false
textViewPlaceHolder.text = "Placeholder text.."

}
}
}

func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async {
self.textViewPlaceHolder.selectedRange = NSMakeRange(0, 0)
}
}


override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
view.addSubview(myTextView)
textViewConstraints()
view.addSubview(textViewPlaceHolder)
myTextViewPHConstraints()

myTextView.delegate = self
textViewPlaceHolder.delegate = self

}

func textViewConstraints() {
myTextView.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -16).isActive = true
myTextView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
myTextView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
myTextView.heightAnchor.constraint(equalToConstant: 200).isActive = true
}

func myTextViewPHConstraints() {
textViewPlaceHolder.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -16).isActive = true
textViewPlaceHolder.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
textViewPlaceHolder.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
textViewPlaceHolder.heightAnchor.constraint(equalToConstant: 200).isActive = true
}

}

正如我上面提到的,我还在学习 Swift,这个问题不是为了解决一个非常具体的问题,它不仅是为了学习如何解决 Swift 扩展中的问题。

注意:不要使用上面的代码来解决占位符问题,因为它不能完美地工作。

最佳答案

你可以这样做:

extension UITextView {

private struct AssociatedKeys {
static var placeholder = "placeholder"
}

var placeholder: String! {
get {
guard let placeholder = objc_getAssociatedObject(self, &AssociatedKeys.placeholder) as? String else {
return String()
}

return placeholder
}

set(value) {
objc_setAssociatedObject(self, &AssociatedKeys.placeholder, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}

关于ios - 具有存储属性的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44113732/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com