Lab 071 – Presentations in Immersive Spaces?
Can we use the new Presentation Component or SwiftUI Pickers in Immersive Spaces?
Overview
This article was written in July of 2025 during the visionOS 26 developer beta. It is possible these restrictions will be lifted in a future version of visionOS.
Since the early days of visionOS we haven’t been able to use presentations (sheets, popovers, pickers, etc) inside volumes and immersive spaces. At WWDC 2025, Apple announced support for a new PresentationComponent for showing popovers relative to a transform/entity. They also mentioned that some other views using presentations are now supported in some new places. The wording of this was careful and considered. Presentations are supported in: Volumes, ornaments of volumes, and Attachments to RealityView.
We already took a first look at presentation component. So what about Immersive Spaces? At first, it seems like “Attachments to RealityView” should indicate that presentations are supported when using RealityView attachments. Unfortunately, that doesn’t seem to be the case. I did three quick tests in this lab.
- Using Presentation Component. When we tap on the rocket, we should toggle a presentation for a card just above it. Result: failed
- Using SwiftUI sheet, popover, and date pickers inside an attachment. This attachment was created using the new
ViewAttachmentComponent. Result: failed - Using SwiftUI sheet, popover, and date pickers inside an attachment. This view was added to the
attachmentsclosure and loaded into the RealityView. Result: partial success- Sheet and popover both failed
- Date Picker worked as expected.
It looks like we are still living in the days of “Presentations are not currently supported in Immersive contexts.” I’m sure there are some good reasons why presentations don’t work in spaces. I’m also sure they are working on it. Hopefully this is something they can figure out soon. In the meantime, we can hack things together using multiple attachments. See these posts for some examples.
Spatial SwiftUI: Using presentations in Volumes
Spatial SwiftUI: Volumetric presentation with attachments
Video Demo
Lab Code
struct Lab071: View {
@State private var subject = Entity()
@State private var showingPopover: Bool = false
var body: some View {
RealityView { content, attachments in
guard let scene = try? await Entity(named: "PresentationComponentLab", in: realityKitContentBundle) else { return }
content.add(scene)
scene.position = [-1, 1.4, -2]
// The main entity we are looking at
guard let subject = scene.findEntity(named: "ToyRocket") else { return }
self.subject = subject
// ❌ Demo 1: Using a TapGesture to show and hide a view with a Presentation Component. Adapted from Lab 064.
// A secondary entity that we can use as the transform point for the presented popover
guard let presentationPoint = scene.findEntity(named: "PresentationPoint") else { return }
// We'll use a TapGesture and the new GestureComponent to toggle the popover
let tapGesture = TapGesture()
.onEnded({
Entity.animate(.bouncy, body: {
showingPopover.toggle()
})
})
let gestureComponent = GestureComponent(tapGesture)
subject.components.set(gestureComponent)
// Create the presentation component using $showingPopover to toggle presentation
let presentation = PresentationComponent(
isPresented: $showingPopover,
configuration: .popover(arrowEdge: .bottom),
content: RocketCard()
)
presentationPoint.components.set(presentation)
// ❌ Demo 2: Adding an attachment using the new ViewAttachmentComponent. The SwiftUI view in the attachment uses picker controls, which rely on Presentations.
let attachmentEntity = Entity()
let attachment = ViewAttachmentComponent(rootView: FormView())
attachmentEntity.components.set(attachment)
subject.addChild(attachmentEntity, preservingWorldTransform: false)
attachmentEntity.setPosition([0, 0.25, 0], relativeTo: subject)
// 🤷🏻♂️ Demo 3: Adding an attachment from the RealityView. The SwiftUI view in the attachment uses picker controls, which rely on Presentations.
if let rootAttachment = attachments.entity(for: "RootAttachment") {
rootAttachment.position = [1, 1.5, -2]
content.add(rootAttachment)
}
} attachments: {
Attachment(id: "RootAttachment", {
FormView()
})
}
}
}RocketCard
fileprivate struct RocketCard: View {
var body: some View {
VStack(spacing: 24) {
Text("Rocket")
.font(.largeTitle)
Text("🚀🚀🚀🚀🚀")
.font(.largeTitle)
}
.foregroundStyle(.black)
.textCase(.uppercase)
.padding()
}
}FormView
fileprivate struct FormView: View {
var title: String = "Immersive Space Presentations!"
@State private var showingSheet = false
@State private var showingPopover = false
@State private var someDate = Date()
var body: some View {
Form() {
Text(title)
.font(.largeTitle)
Button("Show Sheet", action: {
showingSheet.toggle()
})
Button("Show Popover", action: {
showingPopover.toggle()
})
DatePicker("Date Picker",
selection: $someDate,
displayedComponents: .date
)
}
.sheet(isPresented: $showingSheet) {
VStack {
Text("Sheets show up somewhere in the volume, relative to the user")
.padding()
Button("Close Sheet", action: {
showingSheet = false
})
}
}
.popover(isPresented: $showingPopover, attachmentAnchor: .point(.trailing), arrowEdge: .leading, content: {
VStack {
Text("Popovers")
.padding()
Button("Close Popover", action: {
showingPopover = false
})
}
})
.frame(width: 400, height: 300)
.glassBackgroundEffect()
}
}Support our work so we can continue to bring you new examples and articles.

Does anyone know if this is fixed in the visionOS 27 beta?
sheet still doesn’t work from SwiftUI RealityView attachments in a Full Immersive Space on visionOS 26. Is Apple aware of this limitation/bug?
This does not appear to be fixed in visionOS 27. I filed a feedback last year (FB19720746) and I would encourage you to do the same. If you’re running into limitations that are preventing you from making progress, I suggest you file the feedback and then create a post on the Apple Developer Forum, using the feedback number. This can be a helpful way to get some attention on stuff like this. I would set your expectations low. Apple spent very little time on Swift UI for visionOS this year. It looks like they spent all of their time and effort on new features like Reality Composer Pro 3, USDKit, and Spatial Preview.