如何从主 class 访问自定义集合视图单元格 class 中的文本视图
How to access text views in custom collection view cell class from the main class
我的每个集合视图单元格中都有两个文本视图,我为这些单元格定制了 class。这是代码:
class CustomWriterPageCell: UICollectionViewCell {
fileprivate let textViewOne: UITextView = {
let tv = UITextView()
tv.backgroundColor = .cyan
tv.text = "Chapter Title"
tv.font = UIFont(name: "Avenir-Roman", size: 27)
tv.textColor = .gray
return tv
}()
fileprivate let textViewTwo: UITextView = {
let tv = UITextView()
tv.textColor = .gray
tv.text = "Start your story..."
tv.textContainerInset = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15)
tv.font = UIFont(name: "Avenir-Book", size: 23)
tv.backgroundColor = .black
return tv
}()
}
我想在这两个文本视图中添加占位符,但问题是,由于它们是自定义的 class,据我所知,无法找出正在显示哪个文本视图已编辑,所以当 textViewDidEndEditing
发生时我无法添加相应的占位符,有没有办法找出正在编辑的文本视图?有没有办法从主 class?
访问文本视图
您始终可以访问实际的 textView 并知道在委托方法中正在编辑哪个,就像这样:
class ViewController: UIViewController {
var textViewA: UITextView = .init()
var textViewB: UITextView = .init()
override func viewDidLoad() {
super.viewDidLoad()
textViewA.delegate = self
textViewB.delegate = self
}
}
extension ViewController: UITextViewDelegate {
func textViewDidEndEditing(_ textView: UITextView) {
switch textView {
case textViewA:
textView.text = "Placeholder A"
case textViewB:
textView.text = "Placeholder B"
default:
break
}
}
}
此外,由于 UITextView 没有任何内置的占位符机制 - 您可以使用这个不错的广告连播:https://github.com/devxoul/UITextView-Placeholder
如果您使用此 pod 并且不想创建 textView public/internal - 您可以为其创建 computedProperties:
var placeholder: String {
get {
return textView.placeholder
} set {
textView.placeholder = newValue
}
}
在你的 CustomWriterPageCell
class:
fileprivate let textViewOne: UITextView = {
let tv = UITextView()
tv.backgroundColor = .cyan
tv.text = "Chapter Title"
tv.font = UIFont(name: "Avenir-Roman", size: 27)
tv.textColor = .gray
return tv
}()
fileprivate let textViewTwo: UITextView = {
let tv = UITextView()
tv.textColor = .gray
tv.text = "Start your story..."
tv.textContainerInset = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15)
tv.font = UIFont(name: "Avenir-Book", size: 23)
tv.backgroundColor = .black
return tv
}()
override init(frame: CGRect) {
super.init(frame: frame)
textViewOne.delegate = self
textViewTwo.delegate = self
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
然后:
extension CustomWriterPageCell : UITextViewDelegate {
func textViewDidEndEditing(_ textView: UITextView) {
if textView == textViewOne {
textView.text = "..."
}
else if textView == textViewTwo {
textView.text = "..."
}
}
}
这样,您的视图控制器仍然不需要知道您的文本视图。
我的每个集合视图单元格中都有两个文本视图,我为这些单元格定制了 class。这是代码:
class CustomWriterPageCell: UICollectionViewCell {
fileprivate let textViewOne: UITextView = {
let tv = UITextView()
tv.backgroundColor = .cyan
tv.text = "Chapter Title"
tv.font = UIFont(name: "Avenir-Roman", size: 27)
tv.textColor = .gray
return tv
}()
fileprivate let textViewTwo: UITextView = {
let tv = UITextView()
tv.textColor = .gray
tv.text = "Start your story..."
tv.textContainerInset = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15)
tv.font = UIFont(name: "Avenir-Book", size: 23)
tv.backgroundColor = .black
return tv
}()
}
我想在这两个文本视图中添加占位符,但问题是,由于它们是自定义的 class,据我所知,无法找出正在显示哪个文本视图已编辑,所以当 textViewDidEndEditing
发生时我无法添加相应的占位符,有没有办法找出正在编辑的文本视图?有没有办法从主 class?
您始终可以访问实际的 textView 并知道在委托方法中正在编辑哪个,就像这样:
class ViewController: UIViewController {
var textViewA: UITextView = .init()
var textViewB: UITextView = .init()
override func viewDidLoad() {
super.viewDidLoad()
textViewA.delegate = self
textViewB.delegate = self
}
}
extension ViewController: UITextViewDelegate {
func textViewDidEndEditing(_ textView: UITextView) {
switch textView {
case textViewA:
textView.text = "Placeholder A"
case textViewB:
textView.text = "Placeholder B"
default:
break
}
}
}
此外,由于 UITextView 没有任何内置的占位符机制 - 您可以使用这个不错的广告连播:https://github.com/devxoul/UITextView-Placeholder
如果您使用此 pod 并且不想创建 textView public/internal - 您可以为其创建 computedProperties:
var placeholder: String {
get {
return textView.placeholder
} set {
textView.placeholder = newValue
}
}
在你的 CustomWriterPageCell
class:
fileprivate let textViewOne: UITextView = {
let tv = UITextView()
tv.backgroundColor = .cyan
tv.text = "Chapter Title"
tv.font = UIFont(name: "Avenir-Roman", size: 27)
tv.textColor = .gray
return tv
}()
fileprivate let textViewTwo: UITextView = {
let tv = UITextView()
tv.textColor = .gray
tv.text = "Start your story..."
tv.textContainerInset = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15)
tv.font = UIFont(name: "Avenir-Book", size: 23)
tv.backgroundColor = .black
return tv
}()
override init(frame: CGRect) {
super.init(frame: frame)
textViewOne.delegate = self
textViewTwo.delegate = self
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
然后:
extension CustomWriterPageCell : UITextViewDelegate {
func textViewDidEndEditing(_ textView: UITextView) {
if textView == textViewOne {
textView.text = "..."
}
else if textView == textViewTwo {
textView.text = "..."
}
}
}
这样,您的视图控制器仍然不需要知道您的文本视图。