如何在一个视图控制器中快速将占位符设置为多个文本视图

Posted

技术标签:

【中文标题】如何在一个视图控制器中快速将占位符设置为多个文本视图【英文标题】:How to set placeholder to multiple text views in one view controller in swift 【发布时间】:2019-11-18 07:03:21 【问题描述】:

我有一个包含两个文本视图(storyTitle 和storyDe​​scription)的视图控制器。我在两个文本视图中都添加了占位符,下面的代码将向您展示我是如何做到的:

// Setup the story title text field
func setupStoryTitleTextView() 

    storyTitle.textColor = .gray
    storyTitle.text = "Add story title"
    storyTitle.textContainerInset = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20)
    self.storyTitle.delegate = self

    view.addSubview(storyTitle)


// Setup the storyDescription text view
func setupStoryDescriptionTextView() 

    storyDescription.text = "Description of the story"
    storyDescription.textColor = .gray
    storyDescription.textContainerInset = UIEdgeInsets(top: 10, left: 20, bottom: 300, right: 20)
    self.storyDescription.delegate = self

    view.addSubview(storyDescription)


// To remove placeholder text when the user starts typing
func textViewDidBeginEditing(_ textView: UITextView) 

    // Story title text view
    if storyTitle.textColor == .gray 
        storyTitle.text = nil
        storyTitle.textColor = .black
    

    // Story description text view
    if storyDescription.textColor == .gray 
        storyDescription.text = nil
        storyDescription.textColor = .black
    

// To bring the placeholder back when the text views don't contain any text
func textViewDidEndEditing(_ textView: UITextView) 

    // Story title text view
    if storyTitle.text.isEmpty 
        storyTitle.text = "Add story title"
        storyTitle.textColor = .gray
    

    // Story description text view
    if storyDescription.text.isEmpty 
        storyDescription.text = "Description of the story"
        storyDescription.textColor = .gray
    

这里发生的是,当我点击一个文本视图时,两个文本视图中的占位符都消失了,这是因为textViewDidBeginEditing 下的两个 if 条件都被执行了。我怎样才能防止这种情况发生?感谢您提供任何帮助,谢谢:)

【问题讨论】:

【参考方案1】:

您可以通过分配 标签 来查看对象(您的文本视图)轻松地做到这一点。使用 textview.tag = [some number] 分配标签,然后您还可以在条件中添加类似的内容:

storyDescription.tag = 1

func textViewDidBeginEditing(_ textView: UITextView) 
    if textView.tag == 1 && storyTitle.textColor == .gray 
        storyTitle.text = nil
        storyTitle.textColor = .black
    

这类似于另一个文本视图

【讨论】:

我强烈反对为此使用标签,它不可扩展,并且会导致错误。相反,为什么不直接比较textView == storyTitle?这里根本不需要标签 好吧,我同意你的看法。没想到这里可以做这么简单的比较 谢谢你们的回答,我试过@Ferdz的方式,效果很好:) @AbdullahAjmal 您可能应该将其标记为已接受的答案,以便其他人也可以找到它:^)【参考方案2】:
// To remove placeholder text when the user starts typing
func textViewDidBeginEditing(_ textView: UITextView) 

    // Story title text view
    if storyTitle.textColor == .gray 
        storyTitle.text = nil
        storyTitle.textColor = .black
    

    // Story description text view
    if storyDescription.textColor == .gray 
        storyDescription.text = nil
        storyDescription.textColor = .black
    

// To bring the placeholder back when the text views don't contain any text
func textViewDidEndEditing(_ textView: UITextView) 

    // Story title text view
    if storyTitle.text.isEmpty 
        storyTitle.text = "Add story title"
        storyTitle.textColor = .gray
    

    // Story description text view
    if storyDescription.text.isEmpty 
        storyDescription.text = "Description of the story"
        storyDescription.textColor = .gray
    

这段代码将适用于您的两个 TextView。这是错误的,理想情况下您应该使用委托方法中提供的textView,如下所示:

func textViewDidBeginEditing(_ textView: UITextView) 
    if textView.textColor == .gray 
        textView.text = nil
        textView.textColor = .black
    

// To bring the placeholder back when the text views don't contain any text
func textViewDidEndEditing(_ textView: UITextView) 
    if textView.text.isEmpty 
        textView.textColor = .gray
    
    // You can then restore the text depending on which TextView ended the edition, for example:
    if textView == self.storyTitle 
        self.storyTitle.text = "Add story title"
    

顺便说一句,根据颜色决定 TextView 是否显示占位符可能不是最好的方法,尤其是当您计划最终支持装饰字符串时。这完全是另一个讨论,但它会暂时起作用

【讨论】:

这个答案不太正确,因为文本视图中的占位符需要彼此不同,但您使用的是相同的占位符,有没有办法解决这个问题?跨度> 对,在这种情况下,只需对照您的 IBOutlets 检查textView。 EG 如果textView == storyDescription 显示描述占位符,但如果textView == storyTitle 显示标题 哦,是的,这就是我所做的,因为您在上一个答案的评论中提到了这一点,所以如果您可以根据该答案更改您的答案,那么我可以接受它:) 完成,请看代码中的注释 嘿,评论很好,您要更新您的答案,以便我接受它作为正确答案吗?

以上是关于如何在一个视图控制器中快速将占位符设置为多个文本视图的主要内容,如果未能解决你的问题,请参考以下文章

占位符怎么设置

如何通过在模型类上使用 Display(prompt) 属性在脚手架视图中的 HTML 输入中获取占位符文本

PowerPoint2010占位符

如何将占位符文本添加到 ToolStripTextBox?

销毁 2 个 UITextViews 中的占位符

将占位符添加到表格视图单元格上的文本字段