Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set the placeholder string for NSTextView

Is there any way to set the placeholder string for NSTextView like that in NSTextField? I have checked the property but couldn't find it. I have searched some questions but there isn't a proper explanation.

like image 741
Zeist Avatar asked Apr 03 '15 08:04

Zeist


2 Answers

Look for this. It's may be a better approach!

final class CustomTextView: NSTextView {

    private var placeholderAttributedString: NSAttributedString? = NSAttributedString(string: "Your placeholder string here")
    private var placeholderInsets = NSEdgeInsets(top: 0.0, left: 4.0, bottom: 0.0, right: 4.0)

    override func becomeFirstResponder() -> Bool {
        self.needsDisplay = true
        return super.becomeFirstResponder()
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        guard string.isEmpty else { return }
        placeholderAttributedString?.draw(in: dirtyRect.insetBy(placeholderInsets))
    }
}

extension NSRect {
    func insetBy(_ insets: NSEdgeInsets) -> NSRect {
        return insetBy(dx: insets.left + insets.right, dy: insets.top + insets.bottom)
        .applying(CGAffineTransform(translationX: insets.left - insets.right, y: insets.top - insets.bottom))
    }
}
like image 197
Andrew Chersky Avatar answered Jan 01 '23 20:01

Andrew Chersky


Swift 4

As it turns out, there already seems to be a placeholderAttributedString property in NSTextView that isn't exposed publicly. Thus, you can simply implement it in your own subclass and get the default placeholder behaviour (similar to NSTextField).

class PlaceholderTextView: NSTextView {
     @objc var placeholderAttributedString: NSAttributedString?
}

And if this property will be made available in the future, you only need to use NSTextView instead of this subclass.

like image 28
JanApotheker Avatar answered Jan 01 '23 21:01

JanApotheker