SwiftUI Tooltips

Apple Recommended

Replies

For the record there appears to be no native way to set a tooltip on a SwiftUI view (feedback #FB7095924), but the following workaround seems to do the trick:


public extension View {
    /// Overlays this view with a view that provides a toolTip with the given string.
    func toolTip(_ toolTip: String?) -> some View {
        self.overlay(TooltipView(toolTip))
    }
}

private struct TooltipView: NSViewRepresentable {
    let toolTip: String?

    init(_ toolTip: String?) {
        self.toolTip = toolTip
    }

    func makeNSView(context: NSViewRepresentableContext) -> NSView {
        let view = NSView()
        view.toolTip = self.toolTip
        return view
    }

    func updateNSView(_ nsView: NSView, context: NSViewRepresentableContext) {
    }
}
Post marked as downvoted Up vote reply of mwp Down vote reply of mwp
Post marked as solved

Thanks, this was helpful.


I was using Popovers but they have their own issues and seemed a little heavy. This is really clean and works well.

I get the following errors:


Type 'TooltipView' does not conform to protocol 'NSViewRepresentable'

Reference to generic type 'NSViewRepresentableContext' requires arguments in <...>

  • to make it work, change NSViewRepresentableContext to NSViewRepresentableContext<TooltipView>

Add a Comment

so how do I use .help("Tooltip text") view

  • Image(systemName: “arrow.uturn.backward.circle”) .help(”Undo last action”)

  • I tried the above but I don't see the tooltip in my Simulator.

    XCode: Version 15.2 (15C500b)

  • @atluutran - In Xcode inline help for .help() is the hint that this modifier only works in macOS and visionOS.

Add a Comment

Works "as designed" in macOS app! Thanks for the tip/hint. :-)