[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6783":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":36,"readmeContent":37,"aiSummary":38,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":39,"discoverSource":40},6783,"swiftui-introspect","siteline\u002Fswiftui-introspect","siteline","Introspect underlying UIKit\u002FAppKit components from SwiftUI","https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect",null,"Swift",6505,417,55,15,0,2,4,23,8,72.16,"MIT License",false,"main",[26,27,28,29,30,31,32,33,34,35],"appkit","inspect","inspection","introspection","nsview","nsviewcontroller","swiftui","uikit","uiview","uiviewcontroller","2026-06-12 04:00:30","SwiftUI Introspect\n=================\n\n[![CI Status Badge](https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Swift Version Compatibility Badge](https:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fsiteline%2Fswiftui-introspect%2Fbadge%3Ftype%3Dswift-versions)](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect)\n[![Platform Compatibility Badge](https:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fsiteline%2Fswiftui-introspect%2Fbadge%3Ftype%3Dplatforms)](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect)\n\nSwiftUI Introspect lets you access the underlying UIKit or AppKit view for a SwiftUI view.\n\n- [How it works](#how-it-works)\n- [Install](#install)\n    - [Swift Package Manager](#swift-package-manager)\n    - [CocoaPods](#cocoapods)\n- [View Types](#view-types)\n- [Examples](#examples)\n- [General Guidelines](#general-guidelines)\n- [Advanced usage](#advanced-usage)\n    - [Implement your own introspectable type](#implement-your-own-introspectable-type)\n    - [Introspect on future platform versions](#introspect-on-future-platform-versions)\n    - [Keep instances outside the customize closure](#keep-instances-outside-the-customize-closure)\n- [Note for library authors](#note-for-library-authors)\n- [Community projects](#community-projects)\n\nHow it works\n------------\n\nSwiftUI Introspect adds an invisible `IntrospectionView` above the selected view and an invisible anchor below it, then searches the UIKit\u002FAppKit view hierarchy between them to find the relevant view.\n\nFor instance, when introspecting a `ScrollView`...\n\n```swift\nScrollView {\n\tText(\"Item 1\")\n}\n.introspect(.scrollView, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26)) { scrollView in\n\t\u002F\u002F do something with UIScrollView\n}\n```\n\n... it will:\n\n1. Add marker views before and after `ScrollView`.\n2. Traverse through all subviews between both marker views until a `UIScrollView` instance (if any) is found.\n\n> [!IMPORTANT]\n> Although this method is solid and unlikely to break on its own, future OS releases require explicit opt in for introspection (`.iOS(.vXYZ)`) because underlying UIKit\u002FAppKit types can change between major versions.\n\nBy default, `.introspect` acts on its receiver. Calling `.introspect` from inside the view you want to introspect has no effect. If you need to introspect an ancestor instead, set `scope: .ancestor`:\n\n```swift\nScrollView {\n\tText(\"Item 1\")\n\t\t.introspect(.scrollView, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26), scope: .ancestor) { scrollView in\n\t\t\t\u002F\u002F do something with UIScrollView\n\t\t}\n}\n```\n\n### Usage in production\n\nSwiftUI Introspect is suitable for production. It does not use private APIs. It inspects the view hierarchy using public methods and takes a defensive approach: it makes no hard layout assumptions, performs no forced casts to UIKit\u002FAppKit classes, and ignores `.introspect` when the expected UIKit\u002FAppKit view cannot be found.\n\nInstall\n-------\n\n### Swift Package Manager\n\n#### Xcode\n\n\u003Cimg width=\"660\" height=\"300\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fab1c1a62-96d9-417d-ad2b-43012a69cae8\" \u002F>\n\n#### Package.swift\n\n```swift\nlet package = Package(\n\tdependencies: [\n\t\t.package(url: \"https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect\", from: \"26.0.0\"),\n\t],\n\ttargets: [\n\t\t.target(name: \u003C#Target Name#>, dependencies: [\n\t\t\t.product(name: \"SwiftUIIntrospect\", package: \"swiftui-introspect\"),\n\t\t]),\n\t]\n)\n```\n\n### CocoaPods\n\n```ruby\npod 'SwiftUIIntrospect', '~> 26.0.0'\n```\n\nView Types\n----------\n\n### Implemented\n\n- [`Button`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fbuttontype)\n- [`ColorPicker`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fcolorpickertype)\n- [`DatePicker`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fdatepickertype)\n- [`DatePicker` with `.compact` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fdatepickerwithcompactstyletype)\n- [`DatePicker` with `.field` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fdatepickerwithfieldstyletype)\n- [`DatePicker` with `.graphical` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fdatepickerwithgraphicalstyletype)\n- [`DatePicker` with `.stepperField` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fdatepickerwithstepperfieldstyletype)\n- [`DatePicker` with `.wheel` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fdatepickerwithwheelstyletype)\n- [`Form`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fformtype)\n- [`Form` with `.grouped` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fformwithgroupedstyletype)\n- [`.fullScreenCover`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002FfullScreenCovertype)\n- [`List`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flisttype)\n- [`List` with `.bordered` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flistwithborderedstyletype)\n- [`List` with `.grouped` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flistwithgroupedstyletype)\n- [`List` with `.insetGrouped` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flistwithinsetgroupedstyletype)\n- [`List` with `.inset` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flistwithinsetstyletype)\n- [`List` with `.sidebar` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flistwithsidebarstyletype)\n- [`ListCell`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Flistcelltype)\n- [`Map`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fmaptype)\n- [`NavigationSplitView`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fnavigationsplitviewtype)\n- [`NavigationStack`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fnavigationstacktype)\n- [`NavigationView` with `.columns` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002FNavigationViewWithColumnsStyleType)\n- [`NavigationView` with `.stack` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002FNavigationViewWithStackStyleType)\n- [`PageControl`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fpagecontroltype)\n- [`Picker` with `.menu` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fpickerwithmenustyletype)\n- [`Picker` with `.segmented` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fpickerwithsegmentedstyletype)\n- [`Picker` with `.wheel` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fpickerwithwheelstyletype)\n- [`.popover`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fpopovertype)\n- [`ProgressView` with `.circular` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fprogressviewwithcircularstyletype)\n- [`ProgressView` with `.linear` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fprogressviewwithlinearstyletype)\n- [`ScrollView`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fscrollviewtype)\n- [`.searchable`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fsearchfieldtype)\n- [`SecureField`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fsecurefieldtype)\n- [`.sheet`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fsheettype)\n- [`Slider`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fslidertype)\n- [`Stepper`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fsteppertype)\n- [`Table`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftabletype)\n- [`TabView`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftabviewtype)\n- [`TabView` with `.page` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002FTabViewWithPageStyleType)\n- [`TextEditor`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftexteditortype)\n- [`TextField`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftextfieldtype)\n- [`TextField` with `.vertical` axis](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002FTextFieldWithVerticalAxisType)\n- [`Toggle`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftoggletype)\n- [`Toggle` with `button` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftogglewithbuttonstyletype)\n- [`Toggle` with `checkbox` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftogglewithcheckboxstyletype)\n- [`Toggle` with `switch` style](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Ftogglewithswitchstyletype)\n- [`VideoPlayer`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fvideoplayertype)\n- [`View`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fviewtype)\n- [`ViewController`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fviewcontrollertype)\n- [`WebView`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fwebviewtype)\n- [`Window`](https:\u002F\u002Fswiftpackageindex.com\u002Fsiteline\u002Fswiftui-introspect\u002Fmain\u002Fdocumentation\u002Fswiftuiintrospect\u002Fwindowtype)\n\n**Missing an element?** Please [start a discussion](https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect\u002Fdiscussions\u002Fnew?category=ideas). As a temporary solution, you can [implement your own introspectable view type](#implement-your-own-introspectable-type).\n\n### Cannot implement\n\nSwiftUI | Affected Frameworks | Why\n--- | --- | ---\nText | UIKit, AppKit | Not a UILabel \u002F NSLabel\nImage | UIKit, AppKit | Not a UIImageView \u002F NSImageView\nButton | UIKit | Not a UIButton\nLink | UIKit, AppKit | Not a UIButton \u002F NSButton\nNavigationLink | UIKit | Not a UIButton\nGroupBox | AppKit | No underlying view\nMenu | UIKit, AppKit | No underlying view\nSpacer | UIKit, AppKit | No underlying view\nDivider | UIKit, AppKit | No underlying view\nHStack, VStack, ZStack | UIKit, AppKit | No underlying view\nLazyVStack, LazyHStack, LazyVGrid, LazyHGrid | UIKit, AppKit | No underlying view\nColor | UIKit, AppKit | No underlying view\nForEach | UIKit, AppKit | No underlying view\nGeometryReader | UIKit, AppKit | No underlying view\nChart | UIKit, AppKit | Native SwiftUI framework\n\nExamples\n--------\n\n### List\n\n```swift\nList {\n\tText(\"Item\")\n}\n.introspect(.list, on: .iOS(.v13, .v14, .v15)) { tableView in\n\ttableView.bounces = false\n}\n.introspect(.list, on: .iOS(.v16, .v17, .v18, .v26)) { collectionView in\n\tcollectionView.bounces = false\n}\n```\n\n### ScrollView\n\n```swift\nScrollView {\n\tText(\"Item\")\n}\n.introspect(.scrollView, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26)) { scrollView in\n\tscrollView.bounces = false\n}\n```\n\n### NavigationView\n\n```swift\nNavigationView {\n\tText(\"Item\")\n}\n.navigationViewStyle(.stack)\n.introspect(.navigationView(style: .stack), on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26)) { navigationController in\n\tnavigationController.navigationBar.backgroundColor = .cyan\n}\n```\n\n### TextField\n\n```swift\nTextField(\"Text Field\", text: \u003C#Binding\u003CString>#>)\n\t.introspect(.textField, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26)) { textField in\n\t\ttextField.backgroundColor = .red\n\t}\n```\n\nGeneral Guidelines\n------------------\n\nHere are some guidelines to keep in mind when using SwiftUI Introspect:\n\n- **Use sparingly**: prefer native SwiftUI modifiers when available. Use introspection only when you need underlying UIKit\u002FAppKit APIs that SwiftUI does not expose.\n- **Program defensively**: the introspection closure may be called multiple times during the view's lifecycle, such as during view updates or re-renders. Ensure that your customization code can handle being executed multiple times without causing unintended side effects.\n- **Avoid direct state changes**: do not change SwiftUI state from inside the introspection closure. If you must update state, wrap it in `DispatchQueue.main.async`.\n- **Test across OS versions**: underlying implementations can differ by OS, which can affect customization.\n- **Avoid retain cycles**: be cautious about capturing `self` or other strong references within the introspection closure, as this can lead to memory leaks. Use `[weak self]` or `[unowned self]` capture lists as appropriate.\n- **Scope**: `.introspect` targets its receiver by default. Use `scope: .ancestor` only when you need to introspect an ancestor. In general, you shouldn't worry about this as each view type has sensible, predictable default scopes.\n\nAdvanced usage\n--------------\n\n> [!NOTE]\n> These features are advanced and unnecessary for most use cases. Use them when you need extra control or flexibility.\n\n> [!IMPORTANT]\n> To access these features, import SwiftUI Introspect using `@_spi(Advanced)` (see examples below).\n\n### Implement your own introspectable type\n\n**Missing an element?** Please [start a discussion](https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect\u002Fdiscussions\u002Fnew?category=ideas).\n\nIn the unlikely event SwiftUI Introspect does not support the element you need, you can implement your own introspectable type.\n\nFor example, here's how the library implements the introspectable `TextField` type:\n\n```swift\nimport SwiftUI\n@_spi(Advanced) import SwiftUIIntrospect\n\npublic struct TextFieldType: IntrospectableViewType {}\n\nextension IntrospectableViewType where Self == TextFieldType {\n\tpublic static var textField: Self { .init() }\n}\n\n#if canImport(UIKit)\nextension iOSViewVersion\u003CTextFieldType, UITextField> {\n\tpublic static let v13 = Self(for: .v13)\n\tpublic static let v14 = Self(for: .v14)\n\tpublic static let v15 = Self(for: .v15)\n\tpublic static let v16 = Self(for: .v16)\n\tpublic static let v17 = Self(for: .v17)\n\tpublic static let v18 = Self(for: .v18)\n\tpublic static let v26 = Self(for: .v26)\n}\n\nextension tvOSViewVersion\u003CTextFieldType, UITextField> {\n\tpublic static let v13 = Self(for: .v13)\n\tpublic static let v14 = Self(for: .v14)\n\tpublic static let v15 = Self(for: .v15)\n\tpublic static let v16 = Self(for: .v16)\n\tpublic static let v17 = Self(for: .v17)\n\tpublic static let v18 = Self(for: .v18)\n\tpublic static let v26 = Self(for: .v26)\n}\n\nextension visionOSViewVersion\u003CTextFieldType, UITextField> {\n\tpublic static let v1 = Self(for: .v1)\n\tpublic static let v2 = Self(for: .v2)\n\tpublic static let v26 = Self(for: .v26)\n}\n#elseif canImport(AppKit)\nextension macOSViewVersion\u003CTextFieldType, NSTextField> {\n\tpublic static let v10_15 = Self(for: .v10_15)\n\tpublic static let v11 = Self(for: .v11)\n\tpublic static let v12 = Self(for: .v12)\n\tpublic static let v13 = Self(for: .v13)\n\tpublic static let v14 = Self(for: .v14)\n\tpublic static let v15 = Self(for: .v15)\n\tpublic static let v26 = Self(for: .v26)\n}\n#endif\n```\n\n### Introspect on future platform versions\n\nBy default, introspection targets specific platform versions. This is an intentional design decision to maintain maximum predictability in actively maintained apps. However library authors may prefer to cover future versions to limit their commitment to regular maintenance without breaking client apps. For that, SwiftUI Introspect provides range-based version predicates via the Advanced SPI:\n\n```swift\nimport SwiftUI\n@_spi(Advanced) import SwiftUIIntrospect\n\nstruct ContentView: View {\n\tvar body: some View {\n\t\tScrollView {\n\t\t\t\u002F\u002F ...\n\t\t}\n\t\t.introspect(.scrollView, on: .iOS(.v13...)) { scrollView in\n\t\t\t\u002F\u002F ...\n\t\t}\n\t}\n}\n```\n\nUse this cautiously. Future OS versions may change underlying types, in which case the customization closure will not run unless support is explicitly declared.\n\n### Keep instances outside the customize closure\n\nSometimes you need to keep an introspected instance beyond the customization closure. `@State` is not appropriate for this, as it can create retain cycles. Instead, SwiftUI Introspect offers a `@Weak` property wrapper behind the Advanced SPI:\n\n```swift\nimport SwiftUI\n@_spi(Advanced) import SwiftUIIntrospect\n\nstruct ContentView: View {\n\t@Weak var scrollView: UIScrollView?\n\n\tvar body: some View {\n\t\tScrollView {\n\t\t\t\u002F\u002F ...\n\t\t}\n\t\t.introspect(.scrollView, on: .iOS(.v13, .v14, .v15, .v16, .v17, .v18, .v26)) { scrollView in\n\t\t\tself.scrollView = scrollView\n\t\t}\n\t}\n}\n```\n\nNote for library authors\n------------------------\n\nIf your library depends on SwiftUI Introspect, declare a version range that spans at least the **last two major versions** instead of jumping straight to the latest. This avoids conflicts when apps pull the library directly and through multiple dependencies. For example:\n\n```swift\n.package(url: \"https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect\", \"1.3.0\"..\u003C\"27.0.0\"),\n```\n\nA wider range is safe because SwiftUI Introspect is essentially “finished”: no new features will be added, only newer platform versions and view types. Thanks to [`@_spi(Advanced)` imports](https:\u002F\u002Fgithub.com\u002Fsiteline\u002Fswiftui-introspect#introspect-on-future-platform-versions), it is already future proof without frequent version bumps.\n\nCommunity projects\n------------------\n\nHere are some popular open source libraries powered by SwiftUI Introspect:\n\n- [CustomKeyboardKit](https:\u002F\u002Fgithub.com\u002Fpaescebu\u002FCustomKeyboardKit)\n- [swiftui-navigation-transitions](https:\u002F\u002Fgithub.com\u002Fdavdroman\u002Fswiftui-navigation-transitions)\n- [PopupView](https:\u002F\u002Fgithub.com\u002Fexyte\u002FPopupView)\n\nIf you're working on a library built on SwiftUI Introspect or know of one, feel free to submit a PR adding it to the list.\n","SwiftUI Introspect 是一个用于访问 SwiftUI 视图底层的 UIKit 或 AppKit 组件的库。其核心功能是通过在选定视图前后添加不可见标记视图，然后遍历这些标记之间的视图层级结构来找到相应的 UIKit 或 AppKit 视图实例，从而实现对这些底层组件的操作。该库支持多种视图类型，并且可以通过指定平台版本进行未来兼容性处理。适用于需要直接操作底层视图属性或行为的场景，如自定义滚动视图的行为等。由于不使用私有 API 且采取了防御性编程策略，因此适合在生产环境中使用。","2026-06-11 03:08:51","top_language"]