411 Stimmen

Füge Platzhaltertext in UITextView in Swift ein?

Wie kann ich einen Platzhalter in einem UITextView hinzufügen, ähnlich wie bei UITextField, in Swift?

16voto

yesthisisjoe Punkte 2017

Ich habe dies gemacht, indem ich zwei verschiedene Textansichten verwendet habe:

  1. Eine im Hintergrund, die als Platzhalter verwendet wird.
  2. Eine im Vordergrund (mit transparentem Hintergrund), in die der Benutzer tatsächlich eingibt.

Die Idee ist, dass sobald der Benutzer anfängt, etwas in die Vordergrundansicht einzugeben, der Platzhalter in der Hintergrundansicht verschwindet (und wieder erscheint, wenn der Benutzer alles löscht). Es verhält sich also genau wie ein Platzhalter für das Eingabefeld für einzeiligen Text.

Hier ist der Code, den ich dafür verwendet habe. Beachten Sie, dass descriptionField das Feld ist, in das der Benutzer eingibt und descriptionPlaceholder dasjenige im Hintergrund ist.

func textViewDidChange(descriptionField: UITextView) {
    if descriptionField.text.isEmpty == false {
        descriptionPlaceholder.text = ""
    } else {
        descriptionPlaceholder.text = descriptionPlaceholderText
    }
}

11voto

Trupesh Vaghasiya Punkte 460

Swift:

Fügen Sie Ihr TextView @IBOutlet hinzu:

@IBOutlet weak var txtViewMessage: UITextView!

Fügen Sie in der Methode viewWillAppear folgendes hinzu:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    txtViewMessage.delegate = self    // Geben Sie TextViewMessage delegat Methode

    txtViewMessage.text = "Platzhaltername"
    txtViewMessage.textColor = UIColor.lightGray
}

Fügen Sie bitte den Delegate mithilfe der Erweiterung (UITextViewDelegate) hinzu:

// MARK: - UITextViewDelegate
extension ViewController: UITextViewDelegate {

    func textViewDidBeginEditing(_ textView: UITextView) {

        if !txtViewMessage.text!.isEmpty && txtViewMessage.text! == "Platzhaltername" {
            txtViewMessage.text = ""
            txtViewMessage.textColor = UIColor.black
        }
    }

    func textViewDidEndEditing(_ textView: UITextView) {

        if txtViewMessage.text.isEmpty {
            txtViewMessage.text = "Platzhaltername"
            txtViewMessage.textColor = UIColor.lightGray
        }
    }
}

11voto

Leonardo Punkte 155

Ich habe versucht, den Code bequem von clearlight's Antwort zu machen.

extension UITextView{

    func setPlaceholder() {

        let placeholderLabel = UILabel()
        placeholderLabel.text = "Geben Sie etwas Text ein..."
        placeholderLabel.font = UIFont.italicSystemFont(ofSize: (self.font?.pointSize)!)
        placeholderLabel.sizeToFit()
        placeholderLabel.tag = 222
        placeholderLabel.frame.origin = CGPoint(x: 5, y: (self.font?.pointSize)! / 2)
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.isHidden = !self.text.isEmpty

        self.addSubview(placeholderLabel)
    }

    func checkPlaceholder() {
        let placeholderLabel = self.viewWithTag(222) as! UILabel
        placeholderLabel.isHidden = !self.text.isEmpty
    }

}

Verwendung

override func viewDidLoad() {
    textView.delegate = self
    textView.setPlaceholder()
}

func textViewDidChange(_ textView: UITextView) {
    textView.checkPlaceholder()
}

10voto

Pei Punkte 11056

Hier ist, was ich für die Erledigung dieser Aufgabe verwende.

@IBDesignable Klasse UIPlaceholderTextView: UITextView {

    var placeholderLabel: UILabel?

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        sharedInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        sharedInit()
    }

    override func prepareForInterfaceBuilder() {
        sharedInit()
    }

    func sharedInit() {
        refreshPlaceholder()
        NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: UITextView.textDidChangeNotification, object: nil)
    }

    @IBInspectable var placeholder: String? {
        didSet {
            refreshPlaceholder()
        }
    }

    @IBInspectable var placeholderColor: UIColor? = .darkGray {
        didSet {
            refreshPlaceholder()
        }
    }

    @IBInspectable var placeholderFontSize: CGFloat = 14 {
        didSet {
            refreshPlaceholder()
        }
    }

    func refreshPlaceholder() {
        if placeholderLabel == nil {
            placeholderLabel = UILabel()
            let contentView = self.subviews.first ?? self

            contentView.addSubview(placeholderLabel!)
            placeholderLabel?.translatesAutoresizingMaskIntoConstraints = false

            placeholderLabel?.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: textContainerInset.left + 4).isActive = true
            placeholderLabel?.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: textContainerInset.right + 4).isActive = true
            placeholderLabel?.topAnchor.constraint(equalTo: contentView.topAnchor, constant: textContainerInset.top).isActive = true
            placeholderLabel?.bottomAnchor.constraint(lessThanOrEqualTo: contentView.bottomAnchor, constant: textContainerInset.bottom).isActive = true
        }
        placeholderLabel?.text = placeholder
        placeholderLabel?.textColor = placeholderColor
        placeholderLabel?.font = UIFont.systemFont(ofSize: placeholderFontSize)
    }

    @objc func textChanged() {
        if self.placeholder?.isEmpty ?? true {
            return
        }

        UIView.animate(withDuration: 0.25) {
            if self.text.isEmpty {
                self.placeholderLabel?.alpha = 1.0
            } else {
                self.placeholderLabel?.alpha = 0.0
            }
        }
    }

    override var text: String! {
        didSet {
            textChanged()
        }
    }

}

Ich weiß, dass es mehrere ähnliche Ansätze gibt, aber die Vorteile dieses sind, dass es Folgendes kann:

  • Platzhaltertext, Schriftgröße und Farbe in IB festlegen.
  • Zeigt in IB nicht mehr die Warnung "Scroll View has ambiguous scrollable content".
  • Animation für Ein-/Ausblenden des Platzhalters hinzufügen.

6voto

Wert im Ansichtsladen setzen

    txtVw!.autocorrectionType = UITextAutocorrectionType.No
    txtVw!.text = "Schreiben Sie Ihren Platzhalter"
    txtVw!.textColor = UIColor.lightGrayColor()

func textViewDidBeginEditing(textView: UITextView) {
    if (txtVw?.text == "Schreiben Sie Ihren Platzhalter")

    {
        txtVw!.text = nil
        txtVw!.textColor = UIColor.blackColor()
    }
}

func textViewDidEndEditing(textView: UITextView) {
    if txtVw!.text.isEmpty
    {
        txtVw!.text = "Schreiben Sie Ihren Platzhalter"
        txtVw!.textColor = UIColor.lightGrayColor()
    }
    textView.resignFirstResponder()
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X