This still appears to be an issue on iOS 26 and macOS 26.
For a control inside a navigation-bar ToolbarItem, the .buttonStyle(...) workaround is still required. In my case, the tip reaches .available and the isPresented binding flips to true, but nothing is rendered unless the enclosing control has an explicit button style.
Attaching .popoverTip(...) to the inner Label alone is not sufficient; the explicit button style is the important part. This works, and removing .buttonStyle(.plain) breaks presentation:
Toggle(isOn: $isOn) {
Label("Voice", systemImage: "mic")
.labelStyle(.iconOnly)
.popoverTip(tip, isPresented: $isPresented, arrowEdge: .top)
}
.buttonStyle(.plain)
.toggleStyle(.button)
I’m also seeing a separate issue with the popoverTip(_:isPresented:...) overload on iOS 26/macOS 26: if the modifier remains attached while the tip value is nil, or after the tip is dismissed/no longer eligible, an empty popover shell can briefly appear and dismiss itself. This is especially visible on macOS.
The only reliable workaround I’ve found is to remove the .popoverTip(...) modifier from the view hierarchy entirely once the tip is no longer eligible, rather than passing nil:
if tipIsEligible {
label.popoverTip(tip, isPresented: $isPresented)
} else {
label
}
I’ve worked around both issues as best I can, but wanted to leave an update here for anyone else who lands on this thread while debugging TipKit + toolbar presentation, as I did.
Topic:
UI Frameworks
SubTopic:
SwiftUI
Tags: