如何在 Swift 中触摸 UILabel 时对其进行编辑?

Posted

技术标签:

【中文标题】如何在 Swift 中触摸 UILabel 时对其进行编辑?【英文标题】:How can I edit a UILabel upon touching it in Swift? 【发布时间】:2015-07-16 05:54:18 【问题描述】:

我想知道如何在应用程序运行时编辑文本标签。

示例:会有一个名为“点击更改文本”的标签。当用户单击它时,它将是可编辑的,用户可以输入文本并输入。然后它将更改为新文本。

我知道这可以使用 UITextFieldDelegate, 来完成,但我不知道如何处理它,因为当用户触摸标签时无法对标签执行操作。

【问题讨论】:

为什么不使用文本字段而不是标签? 【参考方案1】:

您不能像编辑 textField 那样编辑标签,但是当用户单击标签时,您可以隐藏标签并取消隐藏 textField,当用户完成输入文本时,您可以再次隐藏 textField 并取消隐藏标签,您可以通过以下方式将 textField 的文本分配给标签:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate 

    @IBOutlet weak var lbl: UILabel!
    @IBOutlet weak var textF: UITextField!

    override func viewDidLoad() 
        super.viewDidLoad()
        textF.delegate = self
        textF.hidden = true
        lbl.userInteractionEnabled = true
        let aSelector : Selector = "lblTapped"
        let tapGesture = UITapGestureRecognizer(target: self, action: aSelector)
        tapGesture.numberOfTapsRequired = 1
        lbl.addGestureRecognizer(tapGesture)
    

    func lblTapped()
        lbl.hidden = true
        textF.hidden = false
        textF.text = lbl.text
    

    func textFieldShouldReturn(userText: UITextField) -> Bool 
        userText.resignFirstResponder()
        textF.hidden = true
        lbl.hidden = false
        lbl.text = textF.text
        return true
    

希望它会有所帮助。

【讨论】:

如果我们必须在一个视图中处理多个字段和标签怎么办。 @dharmeshcheni 我和哈马德有同样的问题;我们是否需要为每个文本字段/标签创建单独的函数?谢谢。【参考方案2】:

在这里添加我的 2c 并让我想起斯坦福大学 Paul Hegarty 最新视频中的风格,可以在标签字段的“didSet”中完成设置 - 你也可以通过这种方式为不同的标签设置不同的响应者:

@IBOutlet weak var lblField: UILabel! 
    didSet 
        let recognizer = UILongPressGestureRecognizer()
        recognizer.addTarget(self, action: #selector(ViewController.lbllongpress))
        lblField.addGestureRecognizer(recognizer)
    

然后实现变成:

func lbllongpress(gesture: UILongPressGestureRecognizer) 
    switch gesture.state 
    case UIGestureRecognizerState.began:
        break;
    case UIGestureRecognizerState.ended:
        // Implementation here...
    default: break
    

【讨论】:

【参考方案3】:

将标签改为 UITextField 会更好。这给出了一个标签的外观,点击它是可编辑的。

    通过情节提要创建 UITextfield 将故事板中的 UITextfield 出口连接到视图控制器文件 用观察者分配出口的值
     @IBOutlet weak var barTextField: UITextField! 
            didSet 
                self.barTextField.delegate = self // for step 4
                barTextField.text = "value here"
            
        
    用 UITextFieldDelegate 扩展 viewcontroller,这与步骤 3 中的委托重合 在 UITextFieldDelegate 中实现几个可选函数,包括 textFieldShouldReturn 以检测何时按下回车键
func textFieldShouldReturn(_ textField: UITextField) -> Bool 
        barTextField.resignFirstResponder()
        return true
    

【讨论】:

【参考方案4】:

将 TapGesture (UITapGestureRecognizer) 添加到您的标签。 现在,当用户点击它时,您可以启用文本字段并在文本字段委托方法中将其转换为标签。

【讨论】:

以上是关于如何在 Swift 中触摸 UILabel 时对其进行编辑?的主要内容,如果未能解决你的问题,请参考以下文章

为它后面的 UIViews 制作一个 UILabel 块触摸事件

如何在 UILabel 上仅突出显示触摸文本的背景

为啥嵌套视图中的 UILabel 不接收触摸事件/如何测试响应者链?

在 Swift 中向 UILabel 动态添加行

如何在 Gmail 邮件到达时对其进行编辑?

调整 UITableViewCell 的 contentView 大小时对 UILabel 的过渡效果