agentsclimarketplace

Swiftui uikit interop skill

Skill SwiftyJourney/swiftui-uikit-interop-skill

Use this skill to bridge SwiftUI and UIKit in either direction. Embed SwiftUI in a UIKit app -- present or child-embed a UIHostingController, put SwiftUI in UICollectionView/UITableView cells via UIHostingConfiguration, or build a widget / Live Activity. Wrap UIKit for use in SwiftUI -- UIViewRepresentable / UIViewControllerRepresentable with a Coordinator for delegates and data sources. Pass data and state across the boundary (init params, @Binding, closures, environment/trait forwarding), fix hosting-controller sizing, and migrate a UIKit AppDelegate/SceneDelegate app incrementally to the SwiftUI App lifecycle. Trigger even when the user doesn't say "interop" -- e.g. "show this SwiftUI screen from my view controller", "use my UIKit map view in SwiftUI", "put SwiftUI in a collection view cell". Do NOT use for pure SwiftUI view code (swiftui-expert), app architecture / composition root (ios-architecture-expert), or general Swift language questions (swift-language-expert).From its SKILL.md

Install
npx -y skills add SwiftyJourney/swiftui-uikit-interop-skill

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

7.0 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

SwiftUI ⇄ UIKit Interop

This skill covers the boundary between SwiftUI and UIKit — embedding one inside the other and passing data across. It does not cover pure-SwiftUI view design (use swiftui-expert) or the app's dependency graph (use ios-architecture-expert).

Agent Behavior Contract

When this skill is active, follow these rules strictly:

  1. This skill is only about the boundary. Pure SwiftUI view code → defer to swiftui-expert; app architecture / composition root / DI → defer to ios-architecture-expert.
  2. Wrap UIKit in SwiftUI with a representableUIViewRepresentable for a view, UIViewControllerRepresentable for a view controller. Never new up a UIKit view directly inside a SwiftUI body.
  3. Route all UIKit delegate / data-source / target-action callbacks through a Coordinator (makeCoordinator()), never store mutable UIKit state on the representable struct.
  4. Data flows one way per direction: SwiftUI state → updateUIView/updateUIViewController; UIKit events → Coordinator@Binding/closure. Don't mutate SwiftUI state synchronously from inside updateUIView.
  5. Embed SwiftUI in UIKit with UIHostingController — and when embedding (not presenting), add it as a child view controller (addChild / didMove(toParent:)), not just its view.
  6. Use UIHostingConfiguration for SwiftUI in collection/table cells (iOS 16+) — one configuration per cell, not a UIHostingController per cell.
  7. Keep hosting sizing correct — set sizingOptions / honor intrinsicContentSize / safeAreaRegions so Auto Layout and self-sizing cells measure the SwiftUI content.
  8. Gate version-specific APIs (UIHostingConfiguration iOS 16, UIHostingController.sizingOptions iOS 16, trait-bridged environment iOS 17, @UIApplicationDelegateAdaptor lifecycle) with #available/@available.

Interop Diagnostic Table

SymptomFirst checkSmallest fixDeep dive
Show a SwiftUI screen from a UIKit view controllerPresent vs embedPresent a UIHostingControllerreferences/hosting-controller.md
Embed a SwiftUI view inside an existing UIKit screenChild VC containmentAdd UIHostingController as a child VCreferences/hosting-controller.md
SwiftUI content in a collection/table cellCell configurationUIHostingConfiguration (iOS 16+)references/hosting-configuration.md
Use a UIKit view (map, camera, web) in SwiftUIView wrappingUIViewRepresentable + Coordinatorreferences/representables.md
Use a UIKit view controller in SwiftUIVC wrappingUIViewControllerRepresentable + Coordinatorreferences/representables.md
Delegate/data-source callbacks from wrapped UIKitCallback routingRoute through the Coordinatorreferences/representables.md
Pass data/state between SwiftUI and UIKitDirection of flowinit params + @Binding/closures; forward environment via traitsreferences/passing-data-across-the-boundary.md
Hosted SwiftUI doesn't resize / clips / fights Auto LayoutHosting sizingsizingOptions / intrinsic size / safe-areareferences/hosting-controller.md
SwiftUI in a widget or Live ActivityExtension targetWidgetKit + SwiftUIreferences/widgets-and-live-activities.md
Move a UIKit app onto the SwiftUI lifecycleIncremental migrationAdopt App/Scene, bridge with delegate adaptorsreferences/lifecycle-migration.md

Direction Decision Tree

  1. Which framework owns the screen you're adding to?
    • UIKit owns it, you're adding SwiftUI → embed (UIHostingController, or UIHostingConfiguration for cells)
    • SwiftUI owns it, you need a UIKit view/VC → wrap (UIViewRepresentable / UIViewControllerRepresentable)
  2. Is it a whole screen or a piece? Whole screen → present/push a hosting controller or a representable VC. A piece → child-embed a hosting controller, or wrap a single UIKit view.
  3. Does the UIKit side report events back? → add a Coordinator and bridge via @Binding/closures.
  4. Crossing the lifecycle? Migrating the app entry point → references/lifecycle-migration.md.

Guardrails

  • Do not instantiate UIKit views/VCs directly in a SwiftUI body — wrap them in a representable
  • Do not put delegate/data-source conformance on the representable struct — use the Coordinator (a class)
  • Do not mutate @State/@Binding synchronously inside updateUIView/updateUIViewController (causes update loops) — dispatch or guard for actual change
  • Do not add a hosting controller's view as a subview without also doing child-VC containment (addChild/didMove) — you lose lifecycle and safe-area forwarding
  • Do not create a UIHostingController per cell — use UIHostingConfiguration
  • Do not solve app architecture/DI here — that is ios-architecture-expert's job
  • Do not re-teach pure SwiftUI patterns — defer to swiftui-expert

Reference Router

Open the smallest reference that matches the task:

Keep looking

Skills are one crate of 326,286. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.