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?

2voto

nickoff Punkte 79

Dies ist meine sofort einsatzbereite Lösung, wenn Sie mit mehreren Textansichten arbeiten

func textViewShouldBeginEditing(textView: UITextView) -> Bool {        
    // Setze den Cursor auf den Anfang, wenn der Platzhalter gesetzt ist
    if textView.textColor == UIColor.lightGrayColor() {
        textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument)
    }

    return true
}

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    // Platzhalter entfernen
    if textView.textColor == UIColor.lightGrayColor() && text.characters.count > 0 {
        textView.text = ""
        textView.textColor = UIColor.blackColor()
    }

    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }

    return true
}

func textViewDidChange(textView: UITextView) {
    // Platzhalter setzen, wenn der Text leer ist
    if textView.text.isEmpty {
        textView.text = NSLocalizedString("Hinweis", comment: "hinweis")
        textView.textColor = UIColor.lightGrayColor()
        textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument)
    }
}

func textViewDidChangeSelection(textView: UITextView) {
    // Setze den Cursor auf den Anfang, wenn der Platzhalter gesetzt ist
    let firstPosition = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument)

    // Position nicht rekursiv ändern
    if textView.textColor == UIColor.lightGrayColor() && textView.selectedTextRange != firstPosition {
        textView.selectedTextRange = firstPosition
    }
}

1voto

nullforlife Punkte 1314

Eine weitere Lösung könnte sein, die Benachrichtigungen keyboardWillHide und keyboardWillShow zu verwenden, wie ich es getan habe.

Zunächst müssen Sie das Zuhören und Nicht-Zuhören auf die Benachrichtigungen in den Methoden viewWillAppear und viewWillAppear entsprechend (um Speicherlecks zu behandeln).

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setupKeyboardNotificationListeners(enable: true)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    setupKeyboardNotificationListeners(enable: false)
}

Dann die Methode zum Behandeln des Zuhörens/Nicht-Zuhörens der Benachrichtigungen:

private func setupKeyboardNotificationListeners(enable: Bool) {
        if enable {
            NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        } else {
            NotificationCenter.default.removeObserver(self)
        }
    }

Dann behandeln Sie in den Methoden keyboardWillHide und keyboardWillShow die Platzhalter- und Farbänderungen des Textes.

@objc func keyboardWillShow(notification: NSNotification) {
    if self.textView.text == self.placeholder {
        self.textView.text = ""
        self.textView.textColor = .black
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if self.textView.text.isEmpty {
        self.textView.text = self.placeholder
        self.textView.textColor = .lightGrey
    }
}

Ich fand diese Lösung bisher am besten, da der Text entfernt wird, sobald die Tastatur erscheint, anstatt wenn der Benutzer anfängt zu tippen, was zu Verwirrung führen kann.

1voto

Adam Zarn Punkte 2050

Ich glaube, dass dies eine sehr saubere Lösung ist. Es fügt eine Dummy-Textansicht unterhalb der tatsächlichen Textansicht hinzu und zeigt oder verbirgt sie je nach dem Text in der tatsächlichen Textansicht:

import Foundation
import UIKit

class TextViewWithPlaceholder: UITextView {

    private var placeholderTextView: UITextView = UITextView()

    var placeholder: String? {
        didSet {
            placeholderTextView.text = placeholder
        }
    }

    override var text: String! {
        didSet {
            placeholderTextView.isHidden = text.isEmpty == false
        }
    }

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

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

    private func commonInit() {
        applyCommonTextViewAttributes(to: self)
        configureMainTextView()
        addPlaceholderTextView()
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(textDidChange),
                                               name: UITextView.textDidChangeNotification,
                                               object: nil)
    }

    func addPlaceholderTextView() {
        applyCommonTextViewAttributes(to: placeholderTextView)
        configurePlaceholderTextView()
        insertSubview(placeholderTextView, at: 0)
    }

    private func applyCommonTextViewAttributes(to textView: UITextView) {
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.textContainer.lineFragmentPadding = 0
        textView.textContainerInset = UIEdgeInsets(top: 10,
                                                   left: 10,
                                                   bottom: 10,
                                                   right: 10)
    }

    private func configureMainTextView() {
        // Führe hier jegliche Konfiguration der tatsächlichen Textansicht durch
    }

    private func configurePlaceholderTextView() {
        placeholderTextView.text = placeholder
        placeholderTextView.font = font
        placeholderTextView.textColor = UIColor.lightGray
        placeholderTextView.frame = bounds
        placeholderTextView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        placeholderTextView.frame = bounds
    }

    @objc func textDidChange() {
        placeholderTextView.isHidden = !text.isEmpty
    }

}

1voto

Himanshu Punkte 2812

Es gibt keine solche Eigenschaft in iOS, um Platzhalter direkt in TextView hinzuzufügen. Stattdessen können Sie ein Label hinzufügen und bei Änderungen im TextView anzeigen/ausblenden. SWIFT 2.0 und stellen Sie sicher, dass Sie den Textviewdelegate implementieren.

func textViewDidChange(TextView: UITextView)
{

 if  txtShortDescription.text == ""
    {
        self.lblShortDescription.hidden = false
    }
    else
    {
        self.lblShortDescription.hidden = true
    }

}

1voto

Saurabh Sharma Punkte 187
func setPlaceholder(){
var placeholderLabel = UILabel()
        placeholderLabel.text = "Beschreibe dein Bedürfnis..."
        placeholderLabel.font = UIFont.init(name: "Lato-Regular", size: 15.0) ?? UIFont.boldSystemFont(ofSize: 14.0)
        placeholderLabel.sizeToFit()
        descriptionTextView.addSubview(placeholderLabel)
        placeholderLabel.frame.origin = CGPoint(x: 5, y: (descriptionTextView.font?.pointSize)! / 2)
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.isHidden = !descriptionTextView.text.isEmpty
}

//Delegate Methode.

func textViewDidChange(_ textView: UITextView) {
        placeholderLabel.isHidden = !textView.text.isEmpty
    }

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