未为 UITextView 触发委托协议功能

Posted

技术标签:

【中文标题】未为 UITextView 触发委托协议功能【英文标题】:Delegate protocol functions not triggered for UITextView 【发布时间】:2019-07-30 02:06:47 【问题描述】:

我有这个 swift 文件,我正在尝试创建一个自定义类来处理一个页面上多个文本视图的占位符。我更喜欢一个单独的类,因为我认为它可以更清晰地处理多个视图。问题是,当这些事件发生时,函数 textViewDidEndEditingtextViewDidBeginEditing 没有被调用。

通过将 PostPage 设置为委托,我已经成功地工作了,但我不知道如何使用多个 UITextView 来做到这一点。

这是我的代码:

import UIKit

class PostPage: UIViewController, UITextViewDelegate 

    @IBOutlet weak var eventDescription: UITextView!
    @IBOutlet weak var eventTitle: UITextView!

    var placeholderShowing = true

    override func viewDidLoad() 
        super.viewDidLoad()

        // Add a placeholder for the text
        let ph_descr = PlaceHolderHandler(placeholderText: "Description", textBox: eventDescription)
        eventDescription.delegate = ph_descr

        let ph_title = PlaceHolderHandler(placeholderText: "Title", textBox: eventTitle)
        eventTitle.delegate = ph_title
    



 class PlaceHolderHandler: NSObject, UITextViewDelegate 

    var placeholderShowing = true
    var placeholderText = ""

    required init(placeholderText: String, textBox: UITextView) 
        super.init()
        self.placeholderText = placeholderText
        textBox.text = placeholderText
        textBox.textColor = UIColor.lightGray
    


    // MARK:- UITextViewDelegates

    public func textViewDidBeginEditing(_ textView: UITextView) 
        if self.placeholderShowing 
            textView.text = ""
            textView.textColor = UIColor.black
            self.placeholderShowing = false
        

    

    public func textViewDidEndEditing(_ textView: UITextView) 
        if textView.text == "" 
            textView.text = "Description"
            textView.textColor = UIColor.lightGray
            self.placeholderShowing = true
        
    
 

当我选择任一 UITextViews 时,我希望调用相应的函数,并相应地调整文本。

【问题讨论】:

【参考方案1】:

您需要保留 phDescrphTitle,因为它们在您的代码中是局部变量,因此请在 viewDidLoad 的末尾取消分配

import UIKit

class PostPage: UIViewController, UITextViewDelegate 

    @IBOutlet weak var eventDescription: UITextView!
    @IBOutlet weak var eventTitle: UITextView!

    var placeholderShowing = true

    var phDescr, phTitle:PlaceHolderHandler!

    override func viewDidLoad() 
        super.viewDidLoad()

        // Add a placeholder for the text
        phDescr = PlaceHolderHandler(placeholderText: "Description", textBox: eventDescription)
        eventDescription.delegate = phDescr

        phTitle = PlaceHolderHandler(placeholderText: "Title", textBox: eventTitle)
        eventTitle.delegate = phTitle
    




也可以使用驼峰式命名变量

通过将 PostPage 设置为委托,我已经成功地工作了,但我不知道如何使用多个 UITextView 来做到这一点

当然,您可以将代理设置为 PostPage 并知道哪个 1 是完整使用的

func textViewDidBeginEditing(_ textView: UITextView) 
   if textView == eventDescription 
   
   else   // eventTitle
   
 

【讨论】:

以上是关于未为 UITextView 触发委托协议功能的主要内容,如果未能解决你的问题,请参考以下文章

扩展 UITextView 并触发 onChange 事件的委托

自 iOS 7 中的删除(退格)操作以来,我如何才能不接收 UITextView 委托消息?

UITextView 委托问题

未为 API 侦听器调用 NSFetchedResultsController 委托

iphone设置UITextView委托打破自动完成

resignFirstResponder UITextView