macOS and tvOS support (#12)
This commit is contained in:
parent
b26f5cd067
commit
5d78ad7d17
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
# Shared Xcode version between jobs
|
# Shared Xcode version between jobs
|
||||||
xcode-version: &xcode-version "11.2.1"
|
xcode-version: &xcode-version "11.3.1"
|
||||||
|
|
||||||
# This is the key that we use to store and restore our dependencies cache.
|
# This is the key that we use to store and restore our dependencies cache.
|
||||||
# It needs to be different anytime we add Pods, Gems, or npm packages.
|
# It needs to be different anytime we add Pods, Gems, or npm packages.
|
||||||
|
@ -40,8 +40,20 @@ jobs:
|
||||||
name: Create reports directory
|
name: Create reports directory
|
||||||
command: mkdir output
|
command: mkdir output
|
||||||
- run:
|
- run:
|
||||||
name: Test
|
name: Test iOS/tvOS framework
|
||||||
command: bundle exec fastlane test
|
command: bundle exec fastlane ios test
|
||||||
|
- run:
|
||||||
|
name: Test macOS framework
|
||||||
|
command: bundle exec fastlane mac test
|
||||||
|
- run:
|
||||||
|
name: Lint podspec
|
||||||
|
command: bundle exec pod lib lint
|
||||||
|
- run:
|
||||||
|
name: Build swift package
|
||||||
|
command: swift build
|
||||||
|
- run:
|
||||||
|
name: Test swift package
|
||||||
|
command: swift test
|
||||||
- store_test_results:
|
- store_test_results:
|
||||||
path: output
|
path: output
|
||||||
|
|
|
@ -3,6 +3,8 @@ Changelog
|
||||||
|
|
||||||
## master
|
## master
|
||||||
|
|
||||||
|
- Added `macOS` and `tvOS` support.
|
||||||
|
|
||||||
## [0.0.6]
|
## [0.0.6]
|
||||||
|
|
||||||
- Added `.introspectSegmentedControl()`.
|
- Added `.introspectSegmentedControl()`.
|
||||||
|
|
|
@ -2,14 +2,18 @@ Pod::Spec.new do |spec|
|
||||||
spec.name = 'Introspect'
|
spec.name = 'Introspect'
|
||||||
spec.version = '0.0.6'
|
spec.version = '0.0.6'
|
||||||
spec.license = { type: 'MIT' }
|
spec.license = { type: 'MIT' }
|
||||||
spec.homepage = 'https://github.com/timbersoftware/SwiftUI-Introspect.git'
|
spec.homepage = 'https://github.com/siteline/SwiftUI-Introspect.git'
|
||||||
spec.authors = { 'Lois Di Qual' => 'lois@timber.so' }
|
spec.authors = { 'Lois Di Qual' => 'lois@siteline.com' }
|
||||||
spec.summary = 'Introspect the underlying UIKit element of a SwiftUI view.'
|
spec.summary = 'Introspect the underlying UIKit element of a SwiftUI view.'
|
||||||
spec.source = {
|
spec.source = {
|
||||||
git: 'https://github.com/timbersoftware/SwiftUI-Introspect.git',
|
git: 'https://github.com/siteline/SwiftUI-Introspect.git',
|
||||||
tag: spec.version
|
tag: spec.version
|
||||||
}
|
}
|
||||||
spec.source_files = 'Introspect/**/*.swift'
|
|
||||||
spec.platform = :ios, '13.0'
|
spec.source_files = 'Introspect/*.swift'
|
||||||
|
|
||||||
spec.swift_version = '5.1'
|
spec.swift_version = '5.1'
|
||||||
|
spec.ios.deployment_target = '13.0'
|
||||||
|
spec.tvos.deployment_target = '13.0'
|
||||||
|
spec.osx.deployment_target = '10.15'
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,15 +10,34 @@
|
||||||
C068701C238DE85D00DAFD3D /* Introspect.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0687012238DE85D00DAFD3D /* Introspect.framework */; };
|
C068701C238DE85D00DAFD3D /* Introspect.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0687012238DE85D00DAFD3D /* Introspect.framework */; };
|
||||||
C0687023238DE85D00DAFD3D /* Introspect.h in Headers */ = {isa = PBXBuildFile; fileRef = C0687015238DE85D00DAFD3D /* Introspect.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
C0687023238DE85D00DAFD3D /* Introspect.h in Headers */ = {isa = PBXBuildFile; fileRef = C0687015238DE85D00DAFD3D /* Introspect.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
C068702D238DE8FD00DAFD3D /* Introspect.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068702C238DE8FD00DAFD3D /* Introspect.swift */; };
|
C068702D238DE8FD00DAFD3D /* Introspect.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068702C238DE8FD00DAFD3D /* Introspect.swift */; };
|
||||||
C068702F238DF01200DAFD3D /* TestUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068702E238DF01200DAFD3D /* TestUtils.swift */; };
|
C0796E2723F3CD18002BF033 /* Introspect.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068702C238DE8FD00DAFD3D /* Introspect.swift */; };
|
||||||
C0687031238DF3C900DAFD3D /* IntrospectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0687030238DF3C900DAFD3D /* IntrospectTests.swift */; };
|
C0796E2823F3CD1D002BF033 /* UIKitIntrospectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341423F3A13C005FA859 /* UIKitIntrospectionView.swift */; };
|
||||||
|
C0796E2923F3CD1D002BF033 /* UIKitIntrospectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341623F3A149005FA859 /* UIKitIntrospectionViewController.swift */; };
|
||||||
|
C0796E3423F3CDA4002BF033 /* Introspect.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0796E1F23F3CCD2002BF033 /* Introspect.framework */; };
|
||||||
C0C6D68E238E006B00DA6285 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C6D68D238E006B00DA6285 /* AppDelegate.swift */; };
|
C0C6D68E238E006B00DA6285 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C6D68D238E006B00DA6285 /* AppDelegate.swift */; };
|
||||||
C0C6D690238E006B00DA6285 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C6D68F238E006B00DA6285 /* SceneDelegate.swift */; };
|
C0C6D690238E006B00DA6285 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C6D68F238E006B00DA6285 /* SceneDelegate.swift */; };
|
||||||
C0C6D692238E006B00DA6285 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C6D691238E006B00DA6285 /* ContentView.swift */; };
|
C0C6D692238E006B00DA6285 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C6D691238E006B00DA6285 /* ContentView.swift */; };
|
||||||
C0C6D694238E007100DA6285 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C0C6D693238E007100DA6285 /* Assets.xcassets */; };
|
|
||||||
C0C6D697238E007100DA6285 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C0C6D696238E007100DA6285 /* Preview Assets.xcassets */; };
|
|
||||||
C0C6D69A238E007100DA6285 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0C6D698238E007100DA6285 /* LaunchScreen.storyboard */; };
|
|
||||||
C0C6D6A0238E00D300DA6285 /* Introspect.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0687012238DE85D00DAFD3D /* Introspect.framework */; };
|
C0C6D6A0238E00D300DA6285 /* Introspect.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0687012238DE85D00DAFD3D /* Introspect.framework */; };
|
||||||
|
C0ED341123F39EA2005FA859 /* Introspect.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068702C238DE8FD00DAFD3D /* Introspect.swift */; };
|
||||||
|
C0ED341523F3A13C005FA859 /* UIKitIntrospectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341423F3A13C005FA859 /* UIKitIntrospectionView.swift */; };
|
||||||
|
C0ED341723F3A149005FA859 /* UIKitIntrospectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341623F3A149005FA859 /* UIKitIntrospectionViewController.swift */; };
|
||||||
|
C0ED341B23F3A258005FA859 /* AppKitIntrospectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341A23F3A258005FA859 /* AppKitIntrospectionView.swift */; };
|
||||||
|
C0ED341D23F3A58B005FA859 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341C23F3A58B005FA859 /* ViewExtensions.swift */; };
|
||||||
|
C0ED343A23F3AC43005FA859 /* Introspect.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0ED340923F39E93005FA859 /* Introspect.framework */; };
|
||||||
|
C0ED344023F3AC7F005FA859 /* AppKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED342223F3AC14005FA859 /* AppKitTests.swift */; };
|
||||||
|
C0ED345D23F48534005FA859 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341C23F3A58B005FA859 /* ViewExtensions.swift */; };
|
||||||
|
C0ED345E23F48535005FA859 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341C23F3A58B005FA859 /* ViewExtensions.swift */; };
|
||||||
|
C0ED345F23F48671005FA859 /* AppKitIntrospectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341A23F3A258005FA859 /* AppKitIntrospectionView.swift */; };
|
||||||
|
C0ED346023F48672005FA859 /* AppKitIntrospectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341A23F3A258005FA859 /* AppKitIntrospectionView.swift */; };
|
||||||
|
C0ED346123F486D0005FA859 /* UIKitIntrospectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341423F3A13C005FA859 /* UIKitIntrospectionView.swift */; };
|
||||||
|
C0ED346223F48770005FA859 /* UIKitIntrospectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED341623F3A149005FA859 /* UIKitIntrospectionViewController.swift */; };
|
||||||
|
C0ED346323F48776005FA859 /* Introspect.h in Headers */ = {isa = PBXBuildFile; fileRef = C0687015238DE85D00DAFD3D /* Introspect.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
C0ED346423F48776005FA859 /* Introspect.h in Headers */ = {isa = PBXBuildFile; fileRef = C0687015238DE85D00DAFD3D /* Introspect.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
C0ED346623F48992005FA859 /* UIKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0687030238DF3C900DAFD3D /* UIKitTests.swift */; };
|
||||||
|
C0ED346723F489D5005FA859 /* AppKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED342223F3AC14005FA859 /* AppKitTests.swift */; };
|
||||||
|
C0ED346823F489D5005FA859 /* UIKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0687030238DF3C900DAFD3D /* UIKitTests.swift */; };
|
||||||
|
C0ED346923F489D6005FA859 /* AppKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0ED342223F3AC14005FA859 /* AppKitTests.swift */; };
|
||||||
|
C0ED346A23F489D6005FA859 /* UIKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0687030238DF3C900DAFD3D /* UIKitTests.swift */; };
|
||||||
E0B11E0609FFA04A7B6A1418 /* Pods_IntrospectExamples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5785749C354BCF848BC4EAD9 /* Pods_IntrospectExamples.framework */; };
|
E0B11E0609FFA04A7B6A1418 /* Pods_IntrospectExamples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5785749C354BCF848BC4EAD9 /* Pods_IntrospectExamples.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
@ -30,6 +49,20 @@
|
||||||
remoteGlobalIDString = C0687011238DE85D00DAFD3D;
|
remoteGlobalIDString = C0687011238DE85D00DAFD3D;
|
||||||
remoteInfo = Introspect;
|
remoteInfo = Introspect;
|
||||||
};
|
};
|
||||||
|
C0796E3523F3CDA4002BF033 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = C0687009238DE85D00DAFD3D /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = C0796E1E23F3CCD2002BF033;
|
||||||
|
remoteInfo = "Introspect tvOS";
|
||||||
|
};
|
||||||
|
C0ED343B23F3AC43005FA859 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = C0687009238DE85D00DAFD3D /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = C0ED340823F39E93005FA859;
|
||||||
|
remoteInfo = "Introspect macOS";
|
||||||
|
};
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
@ -39,19 +72,24 @@
|
||||||
C0687012238DE85D00DAFD3D /* Introspect.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Introspect.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
C0687012238DE85D00DAFD3D /* Introspect.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Introspect.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
C0687015238DE85D00DAFD3D /* Introspect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Introspect.h; sourceTree = "<group>"; };
|
C0687015238DE85D00DAFD3D /* Introspect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Introspect.h; sourceTree = "<group>"; };
|
||||||
C0687016238DE85D00DAFD3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
C0687016238DE85D00DAFD3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
C068701B238DE85D00DAFD3D /* IntrospectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntrospectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
C068701B238DE85D00DAFD3D /* Introspect iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Introspect iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
C0687022238DE85D00DAFD3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
C0687022238DE85D00DAFD3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
C068702C238DE8FD00DAFD3D /* Introspect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Introspect.swift; sourceTree = "<group>"; };
|
C068702C238DE8FD00DAFD3D /* Introspect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Introspect.swift; sourceTree = "<group>"; };
|
||||||
C068702E238DF01200DAFD3D /* TestUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestUtils.swift; sourceTree = "<group>"; };
|
C0687030238DF3C900DAFD3D /* UIKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIKitTests.swift; sourceTree = "<group>"; };
|
||||||
C0687030238DF3C900DAFD3D /* IntrospectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntrospectTests.swift; sourceTree = "<group>"; };
|
C0796E1F23F3CCD2002BF033 /* Introspect.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Introspect.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
C0796E2F23F3CDA4002BF033 /* Introspect tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Introspect tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
C0C6D68B238E006B00DA6285 /* IntrospectExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IntrospectExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
C0C6D68B238E006B00DA6285 /* IntrospectExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IntrospectExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
C0C6D68D238E006B00DA6285 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
C0C6D68D238E006B00DA6285 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
C0C6D68F238E006B00DA6285 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
|
C0C6D68F238E006B00DA6285 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
|
||||||
C0C6D691238E006B00DA6285 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
C0C6D691238E006B00DA6285 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
C0C6D693238E007100DA6285 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
||||||
C0C6D696238E007100DA6285 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
|
|
||||||
C0C6D699238E007100DA6285 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
|
||||||
C0C6D69B238E007100DA6285 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
C0C6D69B238E007100DA6285 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
C0ED340923F39E93005FA859 /* Introspect.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Introspect.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
C0ED341423F3A13C005FA859 /* UIKitIntrospectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIKitIntrospectionView.swift; sourceTree = "<group>"; };
|
||||||
|
C0ED341623F3A149005FA859 /* UIKitIntrospectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIKitIntrospectionViewController.swift; sourceTree = "<group>"; };
|
||||||
|
C0ED341A23F3A258005FA859 /* AppKitIntrospectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppKitIntrospectionView.swift; sourceTree = "<group>"; };
|
||||||
|
C0ED341C23F3A58B005FA859 /* ViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewExtensions.swift; sourceTree = "<group>"; };
|
||||||
|
C0ED342223F3AC14005FA859 /* AppKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppKitTests.swift; sourceTree = "<group>"; };
|
||||||
|
C0ED343523F3AC43005FA859 /* Introspect macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Introspect macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -70,6 +108,21 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
C0796E1C23F3CCD2002BF033 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0796E2C23F3CDA4002BF033 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0796E3423F3CDA4002BF033 /* Introspect.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
C0C6D688238E006B00DA6285 /* Frameworks */ = {
|
C0C6D688238E006B00DA6285 /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -79,6 +132,21 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
C0ED340623F39E93005FA859 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0ED343223F3AC43005FA859 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0ED343A23F3AC43005FA859 /* Introspect.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
@ -107,8 +175,12 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C0687012238DE85D00DAFD3D /* Introspect.framework */,
|
C0687012238DE85D00DAFD3D /* Introspect.framework */,
|
||||||
C068701B238DE85D00DAFD3D /* IntrospectTests.xctest */,
|
C068701B238DE85D00DAFD3D /* Introspect iOS Tests.xctest */,
|
||||||
C0C6D68B238E006B00DA6285 /* IntrospectExamples.app */,
|
C0C6D68B238E006B00DA6285 /* IntrospectExamples.app */,
|
||||||
|
C0ED340923F39E93005FA859 /* Introspect.framework */,
|
||||||
|
C0ED343523F3AC43005FA859 /* Introspect macOS Tests.xctest */,
|
||||||
|
C0796E1F23F3CCD2002BF033 /* Introspect.framework */,
|
||||||
|
C0796E2F23F3CDA4002BF033 /* Introspect tvOS Tests.xctest */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -116,9 +188,12 @@
|
||||||
C0687014238DE85D00DAFD3D /* Introspect */ = {
|
C0687014238DE85D00DAFD3D /* Introspect */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C0687015238DE85D00DAFD3D /* Introspect.h */,
|
C0ED341A23F3A258005FA859 /* AppKitIntrospectionView.swift */,
|
||||||
C0687016238DE85D00DAFD3D /* Info.plist */,
|
|
||||||
C068702C238DE8FD00DAFD3D /* Introspect.swift */,
|
C068702C238DE8FD00DAFD3D /* Introspect.swift */,
|
||||||
|
C0ED341623F3A149005FA859 /* UIKitIntrospectionViewController.swift */,
|
||||||
|
C0ED341423F3A13C005FA859 /* UIKitIntrospectionView.swift */,
|
||||||
|
C0ED341C23F3A58B005FA859 /* ViewExtensions.swift */,
|
||||||
|
C0ED346523F4880B005FA859 /* Supporting Files */,
|
||||||
);
|
);
|
||||||
path = Introspect;
|
path = Introspect;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -126,9 +201,9 @@
|
||||||
C068701F238DE85D00DAFD3D /* IntrospectTests */ = {
|
C068701F238DE85D00DAFD3D /* IntrospectTests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
C0ED342223F3AC14005FA859 /* AppKitTests.swift */,
|
||||||
|
C0687030238DF3C900DAFD3D /* UIKitTests.swift */,
|
||||||
C0687022238DE85D00DAFD3D /* Info.plist */,
|
C0687022238DE85D00DAFD3D /* Info.plist */,
|
||||||
C0687030238DF3C900DAFD3D /* IntrospectTests.swift */,
|
|
||||||
C068702E238DF01200DAFD3D /* TestUtils.swift */,
|
|
||||||
);
|
);
|
||||||
path = IntrospectTests;
|
path = IntrospectTests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -139,22 +214,11 @@
|
||||||
C0C6D68D238E006B00DA6285 /* AppDelegate.swift */,
|
C0C6D68D238E006B00DA6285 /* AppDelegate.swift */,
|
||||||
C0C6D68F238E006B00DA6285 /* SceneDelegate.swift */,
|
C0C6D68F238E006B00DA6285 /* SceneDelegate.swift */,
|
||||||
C0C6D691238E006B00DA6285 /* ContentView.swift */,
|
C0C6D691238E006B00DA6285 /* ContentView.swift */,
|
||||||
C0C6D693238E007100DA6285 /* Assets.xcassets */,
|
|
||||||
C0C6D698238E007100DA6285 /* LaunchScreen.storyboard */,
|
|
||||||
C0C6D69B238E007100DA6285 /* Info.plist */,
|
C0C6D69B238E007100DA6285 /* Info.plist */,
|
||||||
C0C6D695238E007100DA6285 /* Preview Content */,
|
|
||||||
);
|
);
|
||||||
path = IntrospectExamples;
|
path = IntrospectExamples;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
C0C6D695238E007100DA6285 /* Preview Content */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
C0C6D696238E007100DA6285 /* Preview Assets.xcassets */,
|
|
||||||
);
|
|
||||||
path = "Preview Content";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
C0C6D69F238E00D300DA6285 /* Frameworks */ = {
|
C0C6D69F238E00D300DA6285 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -163,6 +227,15 @@
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
C0ED346523F4880B005FA859 /* Supporting Files */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C0687016238DE85D00DAFD3D /* Info.plist */,
|
||||||
|
C0687015238DE85D00DAFD3D /* Introspect.h */,
|
||||||
|
);
|
||||||
|
name = "Supporting Files";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
|
@ -174,12 +247,28 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
C0796E1A23F3CCD2002BF033 /* Headers */ = {
|
||||||
|
isa = PBXHeadersBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0ED346423F48776005FA859 /* Introspect.h in Headers */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0ED340423F39E93005FA859 /* Headers */ = {
|
||||||
|
isa = PBXHeadersBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0ED346323F48776005FA859 /* Introspect.h in Headers */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXHeadersBuildPhase section */
|
/* End PBXHeadersBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
C0687011238DE85D00DAFD3D /* Introspect */ = {
|
C0687011238DE85D00DAFD3D /* Introspect iOS */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = C0687026238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "Introspect" */;
|
buildConfigurationList = C0687026238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "Introspect iOS" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
C068700D238DE85D00DAFD3D /* Headers */,
|
C068700D238DE85D00DAFD3D /* Headers */,
|
||||||
C068700E238DE85D00DAFD3D /* Sources */,
|
C068700E238DE85D00DAFD3D /* Sources */,
|
||||||
|
@ -190,14 +279,14 @@
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = Introspect;
|
name = "Introspect iOS";
|
||||||
productName = Introspect;
|
productName = Introspect;
|
||||||
productReference = C0687012238DE85D00DAFD3D /* Introspect.framework */;
|
productReference = C0687012238DE85D00DAFD3D /* Introspect.framework */;
|
||||||
productType = "com.apple.product-type.framework";
|
productType = "com.apple.product-type.framework";
|
||||||
};
|
};
|
||||||
C068701A238DE85D00DAFD3D /* IntrospectTests */ = {
|
C068701A238DE85D00DAFD3D /* Introspect iOS Tests */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = C0687029238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "IntrospectTests" */;
|
buildConfigurationList = C0687029238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "Introspect iOS Tests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
C0687017238DE85D00DAFD3D /* Sources */,
|
C0687017238DE85D00DAFD3D /* Sources */,
|
||||||
C0687018238DE85D00DAFD3D /* Frameworks */,
|
C0687018238DE85D00DAFD3D /* Frameworks */,
|
||||||
|
@ -208,9 +297,45 @@
|
||||||
dependencies = (
|
dependencies = (
|
||||||
C068701E238DE85D00DAFD3D /* PBXTargetDependency */,
|
C068701E238DE85D00DAFD3D /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = IntrospectTests;
|
name = "Introspect iOS Tests";
|
||||||
productName = IntrospectTests;
|
productName = IntrospectTests;
|
||||||
productReference = C068701B238DE85D00DAFD3D /* IntrospectTests.xctest */;
|
productReference = C068701B238DE85D00DAFD3D /* Introspect iOS Tests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
C0796E1E23F3CCD2002BF033 /* Introspect tvOS */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = C0796E2423F3CCD2002BF033 /* Build configuration list for PBXNativeTarget "Introspect tvOS" */;
|
||||||
|
buildPhases = (
|
||||||
|
C0796E1A23F3CCD2002BF033 /* Headers */,
|
||||||
|
C0796E1B23F3CCD2002BF033 /* Sources */,
|
||||||
|
C0796E1C23F3CCD2002BF033 /* Frameworks */,
|
||||||
|
C0796E1D23F3CCD2002BF033 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "Introspect tvOS";
|
||||||
|
productName = "Introspect tvOS";
|
||||||
|
productReference = C0796E1F23F3CCD2002BF033 /* Introspect.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
|
C0796E2E23F3CDA4002BF033 /* Introspect tvOS Tests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = C0796E3723F3CDA4002BF033 /* Build configuration list for PBXNativeTarget "Introspect tvOS Tests" */;
|
||||||
|
buildPhases = (
|
||||||
|
C0796E2B23F3CDA4002BF033 /* Sources */,
|
||||||
|
C0796E2C23F3CDA4002BF033 /* Frameworks */,
|
||||||
|
C0796E2D23F3CDA4002BF033 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
C0796E3623F3CDA4002BF033 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = "Introspect tvOS Tests";
|
||||||
|
productName = "Introspect tvOS Tests";
|
||||||
|
productReference = C0796E2F23F3CDA4002BF033 /* Introspect tvOS Tests.xctest */;
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
};
|
};
|
||||||
C0C6D68A238E006B00DA6285 /* IntrospectExamples */ = {
|
C0C6D68A238E006B00DA6285 /* IntrospectExamples */ = {
|
||||||
|
@ -232,13 +357,49 @@
|
||||||
productReference = C0C6D68B238E006B00DA6285 /* IntrospectExamples.app */;
|
productReference = C0C6D68B238E006B00DA6285 /* IntrospectExamples.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
|
C0ED340823F39E93005FA859 /* Introspect macOS */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = C0ED340E23F39E93005FA859 /* Build configuration list for PBXNativeTarget "Introspect macOS" */;
|
||||||
|
buildPhases = (
|
||||||
|
C0ED340423F39E93005FA859 /* Headers */,
|
||||||
|
C0ED340523F39E93005FA859 /* Sources */,
|
||||||
|
C0ED340623F39E93005FA859 /* Frameworks */,
|
||||||
|
C0ED340723F39E93005FA859 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "Introspect macOS";
|
||||||
|
productName = "Introspect macOS";
|
||||||
|
productReference = C0ED340923F39E93005FA859 /* Introspect.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
|
C0ED343423F3AC43005FA859 /* Introspect macOS Tests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = C0ED343D23F3AC43005FA859 /* Build configuration list for PBXNativeTarget "Introspect macOS Tests" */;
|
||||||
|
buildPhases = (
|
||||||
|
C0ED343123F3AC43005FA859 /* Sources */,
|
||||||
|
C0ED343223F3AC43005FA859 /* Frameworks */,
|
||||||
|
C0ED343323F3AC43005FA859 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
C0ED343C23F3AC43005FA859 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = "Introspect macOS Tests";
|
||||||
|
productName = "Introspect macOS Tests";
|
||||||
|
productReference = C0ED343523F3AC43005FA859 /* Introspect macOS Tests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
/* End PBXNativeTarget section */
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
C0687009238DE85D00DAFD3D /* Project object */ = {
|
C0687009238DE85D00DAFD3D /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 1120;
|
LastSwiftUpdateCheck = 1130;
|
||||||
LastUpgradeCheck = 1120;
|
LastUpgradeCheck = 1120;
|
||||||
ORGANIZATIONNAME = "Lois Di Qual";
|
ORGANIZATIONNAME = "Lois Di Qual";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
|
@ -249,9 +410,21 @@
|
||||||
C068701A238DE85D00DAFD3D = {
|
C068701A238DE85D00DAFD3D = {
|
||||||
CreatedOnToolsVersion = 11.2.1;
|
CreatedOnToolsVersion = 11.2.1;
|
||||||
};
|
};
|
||||||
|
C0796E1E23F3CCD2002BF033 = {
|
||||||
|
CreatedOnToolsVersion = 11.3.1;
|
||||||
|
};
|
||||||
|
C0796E2E23F3CDA4002BF033 = {
|
||||||
|
CreatedOnToolsVersion = 11.3.1;
|
||||||
|
};
|
||||||
C0C6D68A238E006B00DA6285 = {
|
C0C6D68A238E006B00DA6285 = {
|
||||||
CreatedOnToolsVersion = 11.2.1;
|
CreatedOnToolsVersion = 11.2.1;
|
||||||
};
|
};
|
||||||
|
C0ED340823F39E93005FA859 = {
|
||||||
|
CreatedOnToolsVersion = 11.3.1;
|
||||||
|
};
|
||||||
|
C0ED343423F3AC43005FA859 = {
|
||||||
|
CreatedOnToolsVersion = 11.3.1;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = C068700C238DE85D00DAFD3D /* Build configuration list for PBXProject "Introspect" */;
|
buildConfigurationList = C068700C238DE85D00DAFD3D /* Build configuration list for PBXProject "Introspect" */;
|
||||||
|
@ -267,8 +440,12 @@
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
C0687011238DE85D00DAFD3D /* Introspect */,
|
C0687011238DE85D00DAFD3D /* Introspect iOS */,
|
||||||
C068701A238DE85D00DAFD3D /* IntrospectTests */,
|
C068701A238DE85D00DAFD3D /* Introspect iOS Tests */,
|
||||||
|
C0ED340823F39E93005FA859 /* Introspect macOS */,
|
||||||
|
C0ED343423F3AC43005FA859 /* Introspect macOS Tests */,
|
||||||
|
C0796E1E23F3CCD2002BF033 /* Introspect tvOS */,
|
||||||
|
C0796E2E23F3CDA4002BF033 /* Introspect tvOS Tests */,
|
||||||
C0C6D68A238E006B00DA6285 /* IntrospectExamples */,
|
C0C6D68A238E006B00DA6285 /* IntrospectExamples */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -289,13 +466,38 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
C0796E1D23F3CCD2002BF033 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0796E2D23F3CDA4002BF033 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
C0C6D689238E006B00DA6285 /* Resources */ = {
|
C0C6D689238E006B00DA6285 /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C0C6D69A238E007100DA6285 /* LaunchScreen.storyboard in Resources */,
|
);
|
||||||
C0C6D697238E007100DA6285 /* Preview Assets.xcassets in Resources */,
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
C0C6D694238E007100DA6285 /* Assets.xcassets in Resources */,
|
};
|
||||||
|
C0ED340723F39E93005FA859 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0ED343323F3AC43005FA859 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -348,6 +550,10 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C0ED341723F3A149005FA859 /* UIKitIntrospectionViewController.swift in Sources */,
|
||||||
|
C0ED345F23F48671005FA859 /* AppKitIntrospectionView.swift in Sources */,
|
||||||
|
C0ED341523F3A13C005FA859 /* UIKitIntrospectionView.swift in Sources */,
|
||||||
|
C0ED345E23F48535005FA859 /* ViewExtensions.swift in Sources */,
|
||||||
C068702D238DE8FD00DAFD3D /* Introspect.swift in Sources */,
|
C068702D238DE8FD00DAFD3D /* Introspect.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -356,8 +562,29 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C0687031238DF3C900DAFD3D /* IntrospectTests.swift in Sources */,
|
C0ED346823F489D5005FA859 /* UIKitTests.swift in Sources */,
|
||||||
C068702F238DF01200DAFD3D /* TestUtils.swift in Sources */,
|
C0ED346723F489D5005FA859 /* AppKitTests.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0796E1B23F3CCD2002BF033 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0796E2823F3CD1D002BF033 /* UIKitIntrospectionView.swift in Sources */,
|
||||||
|
C0ED346023F48672005FA859 /* AppKitIntrospectionView.swift in Sources */,
|
||||||
|
C0796E2923F3CD1D002BF033 /* UIKitIntrospectionViewController.swift in Sources */,
|
||||||
|
C0ED345D23F48534005FA859 /* ViewExtensions.swift in Sources */,
|
||||||
|
C0796E2723F3CD18002BF033 /* Introspect.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0796E2B23F3CDA4002BF033 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0ED346A23F489D6005FA859 /* UIKitTests.swift in Sources */,
|
||||||
|
C0ED346923F489D6005FA859 /* AppKitTests.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -371,26 +598,46 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
C0ED340523F39E93005FA859 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0ED341B23F3A258005FA859 /* AppKitIntrospectionView.swift in Sources */,
|
||||||
|
C0ED341D23F3A58B005FA859 /* ViewExtensions.swift in Sources */,
|
||||||
|
C0ED346123F486D0005FA859 /* UIKitIntrospectionView.swift in Sources */,
|
||||||
|
C0ED341123F39EA2005FA859 /* Introspect.swift in Sources */,
|
||||||
|
C0ED346223F48770005FA859 /* UIKitIntrospectionViewController.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
C0ED343123F3AC43005FA859 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C0ED346623F48992005FA859 /* UIKitTests.swift in Sources */,
|
||||||
|
C0ED344023F3AC7F005FA859 /* AppKitTests.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
/* Begin PBXTargetDependency section */
|
||||||
C068701E238DE85D00DAFD3D /* PBXTargetDependency */ = {
|
C068701E238DE85D00DAFD3D /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = C0687011238DE85D00DAFD3D /* Introspect */;
|
target = C0687011238DE85D00DAFD3D /* Introspect iOS */;
|
||||||
targetProxy = C068701D238DE85D00DAFD3D /* PBXContainerItemProxy */;
|
targetProxy = C068701D238DE85D00DAFD3D /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
/* End PBXTargetDependency section */
|
C0796E3623F3CDA4002BF033 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
/* Begin PBXVariantGroup section */
|
target = C0796E1E23F3CCD2002BF033 /* Introspect tvOS */;
|
||||||
C0C6D698238E007100DA6285 /* LaunchScreen.storyboard */ = {
|
targetProxy = C0796E3523F3CDA4002BF033 /* PBXContainerItemProxy */;
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
C0C6D699238E007100DA6285 /* Base */,
|
|
||||||
);
|
|
||||||
name = LaunchScreen.storyboard;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
};
|
||||||
/* End PBXVariantGroup section */
|
C0ED343C23F3AC43005FA859 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = C0ED340823F39E93005FA859 /* Introspect macOS */;
|
||||||
|
targetProxy = C0ED343B23F3AC43005FA859 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
C0687024238DE85D00DAFD3D /* Debug */ = {
|
C0687024238DE85D00DAFD3D /* Debug */ = {
|
||||||
|
@ -445,12 +692,14 @@
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
TVOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
VERSION_INFO_PREFIX = "";
|
VERSION_INFO_PREFIX = "";
|
||||||
};
|
};
|
||||||
|
@ -502,11 +751,13 @@
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
TVOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
VERSION_INFO_PREFIX = "";
|
VERSION_INFO_PREFIX = "";
|
||||||
|
@ -517,9 +768,9 @@
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Manual;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = 5CYVM7UEHW;
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
DYLIB_CURRENT_VERSION = 1;
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
@ -530,9 +781,11 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@loader_path/Frameworks",
|
"@loader_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.loisdiqual.Introspect;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.Introspect;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = Introspect;
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
SUPPORTS_MACCATALYST = NO;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
@ -543,9 +796,9 @@
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Manual;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = 5CYVM7UEHW;
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
DYLIB_CURRENT_VERSION = 1;
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
@ -556,9 +809,11 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@loader_path/Frameworks",
|
"@loader_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.loisdiqual.Introspect;
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.Introspect;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = Introspect;
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
SUPPORTS_MACCATALYST = NO;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
|
@ -602,20 +857,108 @@
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
C0796E2523F3CCD2002BF033 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = Introspect/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.Introspect;
|
||||||
|
PRODUCT_NAME = Introspect;
|
||||||
|
SDKROOT = appletvos;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 3;
|
||||||
|
TVOS_DEPLOYMENT_TARGET = 13.2;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C0796E2623F3CCD2002BF033 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = Introspect/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.Introspect;
|
||||||
|
PRODUCT_NAME = Introspect;
|
||||||
|
SDKROOT = appletvos;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 3;
|
||||||
|
TVOS_DEPLOYMENT_TARGET = 13.2;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
C0796E3823F3CDA4002BF033 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = IntrospectTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.siteline.Introspect-tvOS-Tests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = appletvos;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 3;
|
||||||
|
TVOS_DEPLOYMENT_TARGET = 13.2;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C0796E3923F3CDA4002BF033 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = IntrospectTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.siteline.Introspect-tvOS-Tests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = appletvos;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 3;
|
||||||
|
TVOS_DEPLOYMENT_TARGET = 13.2;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
C0C6D69C238E007100DA6285 /* Debug */ = {
|
C0C6D69C238E007100DA6285 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 9BBE78DB32CCDC560004DB54 /* Pods-IntrospectExamples.debug.xcconfig */;
|
baseConfigurationReference = 9BBE78DB32CCDC560004DB54 /* Pods-IntrospectExamples.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"IntrospectExamples/Preview Content\"";
|
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
INFOPLIST_FILE = IntrospectExamples/Info.plist;
|
INFOPLIST_FILE = IntrospectExamples/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.loisdiqual.IntrospectExamples;
|
MARKETING_VERSION = 0.0.6;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.IntrospectExamples;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
@ -628,20 +971,116 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"IntrospectExamples/Preview Content\"";
|
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
INFOPLIST_FILE = IntrospectExamples/Info.plist;
|
INFOPLIST_FILE = IntrospectExamples/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.loisdiqual.IntrospectExamples;
|
MARKETING_VERSION = 0.0.6;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.IntrospectExamples;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
C0ED340F23F39E93005FA859 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DEVELOPMENT_TEAM = "";
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = Introspect/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.Introspect;
|
||||||
|
PRODUCT_NAME = Introspect;
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C0ED341023F39E93005FA859 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DEVELOPMENT_TEAM = "";
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = Introspect/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.siteline.Introspect;
|
||||||
|
PRODUCT_NAME = Introspect;
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
C0ED343E23F3AC43005FA859 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEVELOPMENT_TEAM = "";
|
||||||
|
INFOPLIST_FILE = IntrospectTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
"@loader_path/../Frameworks",
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.siteline.Introspect-macOS-Tests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C0ED343F23F3AC43005FA859 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEVELOPMENT_TEAM = "";
|
||||||
|
INFOPLIST_FILE = IntrospectTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
"@loader_path/../Frameworks",
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.siteline.Introspect-macOS-Tests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
|
@ -654,7 +1093,7 @@
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
C0687026238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "Introspect" */ = {
|
C0687026238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "Introspect iOS" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C0687027238DE85D00DAFD3D /* Debug */,
|
C0687027238DE85D00DAFD3D /* Debug */,
|
||||||
|
@ -663,7 +1102,7 @@
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
C0687029238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "IntrospectTests" */ = {
|
C0687029238DE85D00DAFD3D /* Build configuration list for PBXNativeTarget "Introspect iOS Tests" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
C068702A238DE85D00DAFD3D /* Debug */,
|
C068702A238DE85D00DAFD3D /* Debug */,
|
||||||
|
@ -672,6 +1111,24 @@
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
C0796E2423F3CCD2002BF033 /* Build configuration list for PBXNativeTarget "Introspect tvOS" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
C0796E2523F3CCD2002BF033 /* Debug */,
|
||||||
|
C0796E2623F3CCD2002BF033 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
C0796E3723F3CDA4002BF033 /* Build configuration list for PBXNativeTarget "Introspect tvOS Tests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
C0796E3823F3CDA4002BF033 /* Debug */,
|
||||||
|
C0796E3923F3CDA4002BF033 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
C0C6D69E238E007100DA6285 /* Build configuration list for PBXNativeTarget "IntrospectExamples" */ = {
|
C0C6D69E238E007100DA6285 /* Build configuration list for PBXNativeTarget "IntrospectExamples" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
@ -681,6 +1138,24 @@
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
C0ED340E23F39E93005FA859 /* Build configuration list for PBXNativeTarget "Introspect macOS" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
C0ED340F23F39E93005FA859 /* Debug */,
|
||||||
|
C0ED341023F39E93005FA859 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
C0ED343D23F3AC43005FA859 /* Build configuration list for PBXNativeTarget "Introspect macOS Tests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
C0ED343E23F3AC43005FA859 /* Debug */,
|
||||||
|
C0ED343F23F3AC43005FA859 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
rootObject = C0687009238DE85D00DAFD3D /* Project object */;
|
rootObject = C0687009238DE85D00DAFD3D /* Project object */;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "C0687011238DE85D00DAFD3D"
|
BlueprintIdentifier = "C0687011238DE85D00DAFD3D"
|
||||||
BuildableName = "Introspect.framework"
|
BuildableName = "Introspect.framework"
|
||||||
BlueprintName = "Introspect"
|
BlueprintName = "Introspect iOS"
|
||||||
ReferencedContainer = "container:Introspect.xcodeproj">
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
|
@ -33,8 +33,8 @@
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "C068701A238DE85D00DAFD3D"
|
BlueprintIdentifier = "C068701A238DE85D00DAFD3D"
|
||||||
BuildableName = "IntrospectTests.xctest"
|
BuildableName = "Introspect iOS Tests.xctest"
|
||||||
BlueprintName = "IntrospectTests"
|
BlueprintName = "Introspect iOS Tests"
|
||||||
ReferencedContainer = "container:Introspect.xcodeproj">
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</TestableReference>
|
</TestableReference>
|
||||||
|
@ -62,7 +62,7 @@
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "C0687011238DE85D00DAFD3D"
|
BlueprintIdentifier = "C0687011238DE85D00DAFD3D"
|
||||||
BuildableName = "Introspect.framework"
|
BuildableName = "Introspect.framework"
|
||||||
BlueprintName = "Introspect"
|
BlueprintName = "Introspect iOS"
|
||||||
ReferencedContainer = "container:Introspect.xcodeproj">
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</MacroExpansion>
|
</MacroExpansion>
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1130"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0ED340823F39E93005FA859"
|
||||||
|
BuildableName = "Introspect.framework"
|
||||||
|
BlueprintName = "Introspect macOS"
|
||||||
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0ED343423F3AC43005FA859"
|
||||||
|
BuildableName = "Introspect macOS Tests.xctest"
|
||||||
|
BlueprintName = "Introspect macOS Tests"
|
||||||
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0ED340823F39E93005FA859"
|
||||||
|
BuildableName = "Introspect.framework"
|
||||||
|
BlueprintName = "Introspect macOS"
|
||||||
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1130"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0796E1E23F3CCD2002BF033"
|
||||||
|
BuildableName = "Introspect.framework"
|
||||||
|
BlueprintName = "Introspect tvOS"
|
||||||
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0796E2E23F3CDA4002BF033"
|
||||||
|
BuildableName = "Introspect tvOS Tests.xctest"
|
||||||
|
BlueprintName = "Introspect tvOS Tests"
|
||||||
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0796E1E23F3CCD2002BF033"
|
||||||
|
BuildableName = "Introspect.framework"
|
||||||
|
BlueprintName = "Introspect tvOS"
|
||||||
|
ReferencedContainer = "container:Introspect.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
|
@ -4,16 +4,26 @@
|
||||||
<dict>
|
<dict>
|
||||||
<key>SchemeUserState</key>
|
<key>SchemeUserState</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Introspect.xcscheme_^#shared#^_</key>
|
<key>Introspect iOS.xcscheme_^#shared#^_</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>orderHint</key>
|
<key>orderHint</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IntrospectExamples.xcscheme_^#shared#^_</key>
|
<key>Introspect macOS.xcscheme_^#shared#^_</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>orderHint</key>
|
<key>orderHint</key>
|
||||||
<integer>3</integer>
|
<integer>3</integer>
|
||||||
</dict>
|
</dict>
|
||||||
|
<key>Introspect tvOS.xcscheme_^#shared#^_</key>
|
||||||
|
<dict>
|
||||||
|
<key>orderHint</key>
|
||||||
|
<integer>4</integer>
|
||||||
|
</dict>
|
||||||
|
<key>IntrospectExamples.xcscheme_^#shared#^_</key>
|
||||||
|
<dict>
|
||||||
|
<key>orderHint</key>
|
||||||
|
<integer>5</integer>
|
||||||
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<key>SuppressBuildableAutocreation</key>
|
<key>SuppressBuildableAutocreation</key>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -27,6 +37,26 @@
|
||||||
<key>primary</key>
|
<key>primary</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<key>C0796E1E23F3CCD2002BF033</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>C0796E2E23F3CDA4002BF033</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>C0ED340823F39E93005FA859</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>C0ED343423F3AC43005FA859</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
#if canImport(AppKit)
|
||||||
|
import SwiftUI
|
||||||
|
import AppKit
|
||||||
|
|
||||||
|
/// Introspection NSView that is inserted alongside the target view.
|
||||||
|
public class IntrospectionNSView: NSView {
|
||||||
|
|
||||||
|
required init() {
|
||||||
|
super.init(frame: .zero)
|
||||||
|
isHidden = true
|
||||||
|
}
|
||||||
|
|
||||||
|
public override func hitTest(_ point: NSPoint) -> NSView? {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, unavailable)
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Introspection View that is injected into the UIKit hierarchy alongside the target view.
|
||||||
|
/// After `updateNSView` is called, it calls `selector` to find the target view, then `customize` when the target view is found.
|
||||||
|
public struct AppKitIntrospectionView<TargetViewType: NSView>: NSViewRepresentable {
|
||||||
|
|
||||||
|
/// Method that introspects the view hierarchy to find the target view.
|
||||||
|
/// First argument is the introspection view itself, which is contained in a view host alongside the target view.
|
||||||
|
let selector: (IntrospectionNSView) -> TargetViewType?
|
||||||
|
|
||||||
|
/// User-provided customization method for the target view.
|
||||||
|
let customize: (TargetViewType) -> Void
|
||||||
|
|
||||||
|
public init(
|
||||||
|
selector: @escaping (IntrospectionNSView) -> TargetViewType?,
|
||||||
|
customize: @escaping (TargetViewType) -> Void
|
||||||
|
) {
|
||||||
|
self.selector = selector
|
||||||
|
self.customize = customize
|
||||||
|
}
|
||||||
|
|
||||||
|
public func makeNSView(context: NSViewRepresentableContext<AppKitIntrospectionView>) -> IntrospectionNSView {
|
||||||
|
let view = IntrospectionNSView()
|
||||||
|
view.setAccessibilityLabel("IntrospectionNSView<\(TargetViewType.self)>")
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
/// When `updateNSView` is called after creating the Introspection view, it is not yet in the AppKit hierarchy.
|
||||||
|
/// At this point, `introspectionView.superview.superview` is nil and we can't access the target AppKit view.
|
||||||
|
/// To workaround this, we wait until the runloop is done inserting the introspection view in the hierarchy, then run the selector.
|
||||||
|
/// Finding the target view fails silently if the selector yield no result. This happens when `updateNSView`
|
||||||
|
/// gets called when the introspection view gets removed from the hierarchy.
|
||||||
|
public func updateNSView(
|
||||||
|
_ nsView: IntrospectionNSView,
|
||||||
|
context: NSViewRepresentableContext<AppKitIntrospectionView>
|
||||||
|
) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
guard let targetView = self.selector(nsView) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.customize(targetView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.0</string>
|
<string>0.0.6</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
|
@ -1,14 +1,28 @@
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
public typealias PlatformView = NSView
|
||||||
|
#endif
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
public typealias PlatformView = UIView
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
public typealias PlatformViewController = NSViewController
|
||||||
|
#endif
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
public typealias PlatformViewController = UIViewController
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Utility methods to inspect the UIKit view hierarchy.
|
/// Utility methods to inspect the UIKit view hierarchy.
|
||||||
public enum Introspect {
|
public enum Introspect {
|
||||||
|
|
||||||
/// Finds a subview of the specified type.
|
/// Finds a subview of the specified type.
|
||||||
/// This method will recursively look for this view.
|
/// This method will recursively look for this view.
|
||||||
/// Returns nil if it can't find a view of the specified type.
|
/// Returns nil if it can't find a view of the specified type.
|
||||||
public static func findChild<AnyViewType: UIView>(
|
public static func findChild<AnyViewType: PlatformView>(
|
||||||
ofType type: AnyViewType.Type,
|
ofType type: AnyViewType.Type,
|
||||||
in root: UIView
|
in root: PlatformView
|
||||||
) -> AnyViewType? {
|
) -> AnyViewType? {
|
||||||
for subview in root.subviews {
|
for subview in root.subviews {
|
||||||
if let typed = subview as? AnyViewType {
|
if let typed = subview as? AnyViewType {
|
||||||
|
@ -23,9 +37,9 @@ public enum Introspect {
|
||||||
/// Finds a child view controller of the specified type.
|
/// Finds a child view controller of the specified type.
|
||||||
/// This method will recursively look for this child.
|
/// This method will recursively look for this child.
|
||||||
/// Returns nil if it can't find a view of the specified type.
|
/// Returns nil if it can't find a view of the specified type.
|
||||||
public static func findChild<AnyViewControllerType: UIViewController>(
|
public static func findChild<AnyViewControllerType: PlatformViewController>(
|
||||||
ofType type: AnyViewControllerType.Type,
|
ofType type: AnyViewControllerType.Type,
|
||||||
in root: UIViewController
|
in root: PlatformViewController
|
||||||
) -> AnyViewControllerType? {
|
) -> AnyViewControllerType? {
|
||||||
for child in root.children {
|
for child in root.children {
|
||||||
if let typed = child as? AnyViewControllerType {
|
if let typed = child as? AnyViewControllerType {
|
||||||
|
@ -40,9 +54,9 @@ public enum Introspect {
|
||||||
/// Finds a previous sibling that contains a view of the specified type.
|
/// Finds a previous sibling that contains a view of the specified type.
|
||||||
/// This method inspects siblings recursively.
|
/// This method inspects siblings recursively.
|
||||||
/// Returns nil if no sibling contains the specified type.
|
/// Returns nil if no sibling contains the specified type.
|
||||||
public static func previousSibling<AnyViewType: UIView>(
|
public static func previousSibling<AnyViewType: PlatformView>(
|
||||||
containing type: AnyViewType.Type,
|
containing type: AnyViewType.Type,
|
||||||
from entry: UIView
|
from entry: PlatformView
|
||||||
) -> AnyViewType? {
|
) -> AnyViewType? {
|
||||||
|
|
||||||
guard let superview = entry.superview,
|
guard let superview = entry.superview,
|
||||||
|
@ -64,9 +78,10 @@ public enum Introspect {
|
||||||
/// Finds a previous sibling that contains a view controller of the specified type.
|
/// Finds a previous sibling that contains a view controller of the specified type.
|
||||||
/// This method inspects siblings recursively.
|
/// This method inspects siblings recursively.
|
||||||
/// Returns nil if no sibling contains the specified type.
|
/// Returns nil if no sibling contains the specified type.
|
||||||
public static func previousSibling<AnyViewControllerType: UIViewController>(
|
@available(macOS, unavailable)
|
||||||
|
public static func previousSibling<AnyViewControllerType: PlatformViewController>(
|
||||||
containing type: AnyViewControllerType.Type,
|
containing type: AnyViewControllerType.Type,
|
||||||
from entry: UIViewController
|
from entry: PlatformViewController
|
||||||
) -> AnyViewControllerType? {
|
) -> AnyViewControllerType? {
|
||||||
|
|
||||||
guard let parent = entry.parent,
|
guard let parent = entry.parent,
|
||||||
|
@ -88,9 +103,9 @@ public enum Introspect {
|
||||||
/// Finds a previous sibling that is a view controller of the specified type.
|
/// Finds a previous sibling that is a view controller of the specified type.
|
||||||
/// This method does not inspect siblings recursively.
|
/// This method does not inspect siblings recursively.
|
||||||
/// Returns nil if no sibling is of the specified type.
|
/// Returns nil if no sibling is of the specified type.
|
||||||
public static func previousSibling<AnyViewControllerType: UIViewController>(
|
public static func previousSibling<AnyViewControllerType: PlatformViewController>(
|
||||||
ofType type: AnyViewControllerType.Type,
|
ofType type: AnyViewControllerType.Type,
|
||||||
from entry: UIViewController
|
from entry: PlatformViewController
|
||||||
) -> AnyViewControllerType? {
|
) -> AnyViewControllerType? {
|
||||||
|
|
||||||
guard let parent = entry.parent,
|
guard let parent = entry.parent,
|
||||||
|
@ -112,9 +127,9 @@ public enum Introspect {
|
||||||
/// Finds a next sibling that contains a view of the specified type.
|
/// Finds a next sibling that contains a view of the specified type.
|
||||||
/// This method inspects siblings recursively.
|
/// This method inspects siblings recursively.
|
||||||
/// Returns nil if no sibling contains the specified type.
|
/// Returns nil if no sibling contains the specified type.
|
||||||
public static func nextSibling<AnyViewType: UIView>(
|
public static func nextSibling<AnyViewType: PlatformView>(
|
||||||
containing type: AnyViewType.Type,
|
containing type: AnyViewType.Type,
|
||||||
from entry: UIView
|
from entry: PlatformView
|
||||||
) -> AnyViewType? {
|
) -> AnyViewType? {
|
||||||
|
|
||||||
guard let superview = entry.superview,
|
guard let superview = entry.superview,
|
||||||
|
@ -134,7 +149,7 @@ public enum Introspect {
|
||||||
|
|
||||||
/// Finds an ancestor of the specified type.
|
/// Finds an ancestor of the specified type.
|
||||||
/// If it reaches the top of the view without finding the specified view type, it returns nil.
|
/// If it reaches the top of the view without finding the specified view type, it returns nil.
|
||||||
public static func findAncestor<AnyViewType: UIView>(ofType type: AnyViewType.Type, from entry: UIView) -> AnyViewType? {
|
public static func findAncestor<AnyViewType: PlatformView>(ofType type: AnyViewType.Type, from entry: PlatformView) -> AnyViewType? {
|
||||||
var superview = entry.superview
|
var superview = entry.superview
|
||||||
while let s = superview {
|
while let s = superview {
|
||||||
if let typed = s as? AnyViewType {
|
if let typed = s as? AnyViewType {
|
||||||
|
@ -149,10 +164,10 @@ public enum Introspect {
|
||||||
/// Hosting views generally contain subviews for one specific SwiftUI element.
|
/// Hosting views generally contain subviews for one specific SwiftUI element.
|
||||||
/// For instance, if there are multiple text fields in a VStack, the hosting view will contain those text fields (and their host views, see below).
|
/// For instance, if there are multiple text fields in a VStack, the hosting view will contain those text fields (and their host views, see below).
|
||||||
/// Returns nil if it couldn't find a hosting view. This should never happen when called with an IntrospectionView.
|
/// Returns nil if it couldn't find a hosting view. This should never happen when called with an IntrospectionView.
|
||||||
public static func findHostingView(from entry: UIView) -> UIView? {
|
public static func findHostingView(from entry: PlatformView) -> PlatformView? {
|
||||||
var superview = entry.superview
|
var superview = entry.superview
|
||||||
while let s = superview {
|
while let s = superview {
|
||||||
if NSStringFromClass(type(of: s)).contains("UIHostingView") {
|
if NSStringFromClass(type(of: s)).contains("HostingView") {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
superview = s.superview
|
superview = s.superview
|
||||||
|
@ -163,7 +178,7 @@ public enum Introspect {
|
||||||
/// Finds the view host of a specific view.
|
/// Finds the view host of a specific view.
|
||||||
/// SwiftUI wraps each UIView within a ViewHost, then within a HostingView.
|
/// SwiftUI wraps each UIView within a ViewHost, then within a HostingView.
|
||||||
/// Returns nil if it couldn't find a view host. This should never happen when called with an IntrospectionView.
|
/// Returns nil if it couldn't find a view host. This should never happen when called with an IntrospectionView.
|
||||||
public static func findViewHost(from entry: UIView) -> UIView? {
|
public static func findViewHost(from entry: PlatformView) -> PlatformView? {
|
||||||
var superview = entry.superview
|
var superview = entry.superview
|
||||||
while let s = superview {
|
while let s = superview {
|
||||||
if NSStringFromClass(type(of: s)).contains("ViewHost") {
|
if NSStringFromClass(type(of: s)).contains("ViewHost") {
|
||||||
|
@ -175,6 +190,22 @@ public enum Introspect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum TargetViewSelector {
|
||||||
|
public static func sibling<TargetView: PlatformView>(from entry: PlatformView) -> TargetView? {
|
||||||
|
guard let viewHost = Introspect.findViewHost(from: entry) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Introspect.previousSibling(containing: TargetView.self, from: viewHost)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func ancestorOrSibling<TargetView: PlatformView>(from entry: PlatformView) -> TargetView? {
|
||||||
|
if let tableView = Introspect.findAncestor(ofType: TargetView.self, from: entry) {
|
||||||
|
return tableView
|
||||||
|
}
|
||||||
|
return sibling(from: entry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Allows to safely access an array element by index
|
/// Allows to safely access an array element by index
|
||||||
/// Usage: array[safe: 2]
|
/// Usage: array[safe: 2]
|
||||||
private extension Array {
|
private extension Array {
|
||||||
|
@ -186,245 +217,3 @@ private extension Array {
|
||||||
return self[index]
|
return self[index]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Introspection UIView that is inserted alongside the target view.
|
|
||||||
public class IntrospectionUIView: UIView {
|
|
||||||
|
|
||||||
required init() {
|
|
||||||
super.init(frame: .zero)
|
|
||||||
isHidden = true
|
|
||||||
isUserInteractionEnabled = false
|
|
||||||
}
|
|
||||||
|
|
||||||
@available(*, unavailable)
|
|
||||||
required init?(coder: NSCoder) {
|
|
||||||
fatalError("init(coder:) has not been implemented")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Introspection View that is injected into the UIKit hierarchy alongside the target view.
|
|
||||||
/// After `updateUIView` is called, it calls `selector` to find the target view, then `customize` when the target view is found.
|
|
||||||
public struct IntrospectionView<TargetViewType: UIView>: UIViewRepresentable {
|
|
||||||
|
|
||||||
/// Method that introspects the view hierarchy to find the target view.
|
|
||||||
/// First argument is the introspection view itself, which is contained in a view host alongside the target view.
|
|
||||||
let selector: (IntrospectionUIView) -> TargetViewType?
|
|
||||||
|
|
||||||
/// User-provided customization method for the target view.
|
|
||||||
let customize: (TargetViewType) -> Void
|
|
||||||
|
|
||||||
public init(
|
|
||||||
selector: @escaping (UIView) -> TargetViewType?,
|
|
||||||
customize: @escaping (TargetViewType) -> Void
|
|
||||||
) {
|
|
||||||
self.selector = selector
|
|
||||||
self.customize = customize
|
|
||||||
}
|
|
||||||
|
|
||||||
public func makeUIView(context: UIViewRepresentableContext<IntrospectionView>) -> IntrospectionUIView {
|
|
||||||
let view = IntrospectionUIView()
|
|
||||||
view.accessibilityLabel = "IntrospectionUIView<\(TargetViewType.self)>"
|
|
||||||
return view
|
|
||||||
}
|
|
||||||
|
|
||||||
/// When `updateUiView` is called after creating the Introspection view, it is not yet in the UIKit hierarchy.
|
|
||||||
/// At this point, `introspectionView.superview.superview` is nil and we can't access the target UIKit view.
|
|
||||||
/// To workaround this, we wait until the runloop is done inserting the introspection view in the hierarchy, then run the selector.
|
|
||||||
/// Finding the target view fails silently if the selector yield no result. This happens when `updateUIView`
|
|
||||||
/// gets called when the introspection view gets removed from the hierarchy.
|
|
||||||
public func updateUIView(
|
|
||||||
_ uiView: IntrospectionUIView,
|
|
||||||
context: UIViewRepresentableContext<IntrospectionView>
|
|
||||||
) {
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
|
||||||
guard let targetView = self.selector(uiView) else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
self.customize(targetView)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Introspection UIViewController that is inserted alongside the target view controller.
|
|
||||||
public class IntrospectionUIViewController: UIViewController {
|
|
||||||
required init() {
|
|
||||||
super.init(nibName: nil, bundle: nil)
|
|
||||||
view = IntrospectionUIView()
|
|
||||||
}
|
|
||||||
|
|
||||||
@available(*, unavailable)
|
|
||||||
required init?(coder: NSCoder) {
|
|
||||||
fatalError("init(coder:) has not been implemented")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// This is the same logic as IntrospectionView but for view controllers. Please see details above.
|
|
||||||
public struct IntrospectionViewController<TargetViewControllerType: UIViewController>: UIViewControllerRepresentable {
|
|
||||||
|
|
||||||
let selector: (IntrospectionUIViewController) -> TargetViewControllerType?
|
|
||||||
let customize: (TargetViewControllerType) -> Void
|
|
||||||
|
|
||||||
public init(
|
|
||||||
selector: @escaping (UIViewController) -> TargetViewControllerType?,
|
|
||||||
customize: @escaping (TargetViewControllerType) -> Void
|
|
||||||
) {
|
|
||||||
self.selector = selector
|
|
||||||
self.customize = customize
|
|
||||||
}
|
|
||||||
|
|
||||||
public func makeUIViewController(
|
|
||||||
context: UIViewControllerRepresentableContext<IntrospectionViewController>
|
|
||||||
) -> IntrospectionUIViewController {
|
|
||||||
let viewController = IntrospectionUIViewController()
|
|
||||||
viewController.accessibilityLabel = "IntrospectionUIViewController<\(TargetViewControllerType.self)>"
|
|
||||||
viewController.view.accessibilityLabel = "IntrospectionUIView<\(TargetViewControllerType.self)>"
|
|
||||||
return viewController
|
|
||||||
}
|
|
||||||
|
|
||||||
public func updateUIViewController(
|
|
||||||
_ uiViewController: IntrospectionUIViewController,
|
|
||||||
context: UIViewControllerRepresentableContext<IntrospectionViewController>
|
|
||||||
) {
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
|
||||||
guard let targetView = self.selector(uiViewController) else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
self.customize(targetView)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extension View {
|
|
||||||
|
|
||||||
public func inject<SomeView>(_ view: SomeView) -> some View where SomeView: View {
|
|
||||||
return overlay(view.frame(width: 0, height: 0))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UITableView` from a `SwiftUI.List`, or `SwiftUI.List` child.
|
|
||||||
public func introspectTableView(customize: @escaping (UITableView) -> ()) -> some View {
|
|
||||||
return inject(IntrospectionView(
|
|
||||||
selector: { introspectionView in
|
|
||||||
|
|
||||||
// Search in ancestors
|
|
||||||
if let tableView = Introspect.findAncestor(ofType: UITableView.self, from: introspectionView) {
|
|
||||||
return tableView
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let viewHost = Introspect.findViewHost(from: introspectionView) else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search in siblings
|
|
||||||
return Introspect.previousSibling(containing: UITableView.self, from: viewHost)
|
|
||||||
},
|
|
||||||
customize: customize
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UIScrollView` from a `SwiftUI.ScrollView`, or `SwiftUI.ScrollView` child.
|
|
||||||
public func introspectScrollView(customize: @escaping (UIScrollView) -> ()) -> some View {
|
|
||||||
return inject(IntrospectionView(
|
|
||||||
selector: { introspectionView in
|
|
||||||
|
|
||||||
// Search in ancestors
|
|
||||||
if let tableView = Introspect.findAncestor(ofType: UIScrollView.self, from: introspectionView) {
|
|
||||||
return tableView
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let viewHost = Introspect.findViewHost(from: introspectionView) else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search in siblings
|
|
||||||
return Introspect.previousSibling(containing: UIScrollView.self, from: viewHost)
|
|
||||||
},
|
|
||||||
customize: customize
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UINavigationController` from any view embedded in a `SwiftUI.NavigationView`.
|
|
||||||
public func introspectNavigationController(customize: @escaping (UINavigationController) -> ()) -> some View {
|
|
||||||
return inject(IntrospectionViewController(
|
|
||||||
selector: { introspectionViewController in
|
|
||||||
|
|
||||||
// Search in ancestors
|
|
||||||
if let navigationController = introspectionViewController.navigationController {
|
|
||||||
return navigationController
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search in siblings
|
|
||||||
return Introspect.previousSibling(containing: UINavigationController.self, from: introspectionViewController)
|
|
||||||
},
|
|
||||||
customize: customize
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds the containing `UIViewController` of a SwiftUI view.
|
|
||||||
public func introspectViewController(customize: @escaping (UIViewController) -> ()) -> some View {
|
|
||||||
return inject(IntrospectionViewController(
|
|
||||||
selector: { $0.parent },
|
|
||||||
customize: customize
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UITabBarController` from any SwiftUI view embedded in a `SwiftUI.TabView`
|
|
||||||
public func introspectTabBarController(customize: @escaping (UITabBarController) -> ()) -> some View {
|
|
||||||
return inject(IntrospectionViewController(
|
|
||||||
selector: { introspectionViewController in
|
|
||||||
|
|
||||||
// Search in ancestors
|
|
||||||
if let navigationController = introspectionViewController.tabBarController {
|
|
||||||
return navigationController
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search in siblings
|
|
||||||
return Introspect.previousSibling(ofType: UITabBarController.self, from: introspectionViewController)
|
|
||||||
},
|
|
||||||
customize: customize
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `TargetView` from a `SwiftUI.View`
|
|
||||||
public func introspect<TargetView: UIView>(customize: @escaping (TargetView) -> ()) -> some View {
|
|
||||||
return inject(IntrospectionView(
|
|
||||||
selector: { introspectionView in
|
|
||||||
guard let viewHost = Introspect.findViewHost(from: introspectionView) else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return Introspect.previousSibling(containing: TargetView.self, from: viewHost)
|
|
||||||
},
|
|
||||||
customize: customize
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UITextField` from a `SwiftUI.TextField`
|
|
||||||
public func introspectTextField(customize: @escaping (UITextField) -> ()) -> some View {
|
|
||||||
return introspect(customize: customize)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UISwitch` from a `SwiftUI.Toggle`
|
|
||||||
public func introspectSwitch(customize: @escaping (UISwitch) -> ()) -> some View {
|
|
||||||
return introspect(customize: customize)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UISlider` from a `SwiftUI.Slider`
|
|
||||||
public func introspectSlider(customize: @escaping (UISlider) -> ()) -> some View {
|
|
||||||
return introspect(customize: customize)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UIStepper` from a `SwiftUI.Stepper`
|
|
||||||
public func introspectStepper(customize: @escaping (UIStepper) -> ()) -> some View {
|
|
||||||
return introspect(customize: customize)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UIDatePicker` from a `SwiftUI.DatePicker`
|
|
||||||
public func introspectDatePicker(customize: @escaping (UIDatePicker) -> ()) -> some View {
|
|
||||||
return introspect(customize: customize)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Finds a `UISegmentedControl` from a `SwiftUI.Picker` with style `SegmentedPickerStyle`
|
|
||||||
public func introspectSegmentedControl(customize: @escaping (UISegmentedControl) -> ()) -> some View {
|
|
||||||
return introspect(customize: customize)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
#if canImport(UIKit)
|
||||||
|
import UIKit
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// Introspection UIView that is inserted alongside the target view.
|
||||||
|
public class IntrospectionUIView: UIView {
|
||||||
|
|
||||||
|
required init() {
|
||||||
|
super.init(frame: .zero)
|
||||||
|
isHidden = true
|
||||||
|
isUserInteractionEnabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, unavailable)
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Introspection View that is injected into the UIKit hierarchy alongside the target view.
|
||||||
|
/// After `updateUIView` is called, it calls `selector` to find the target view, then `customize` when the target view is found.
|
||||||
|
public struct UIKitIntrospectionView<TargetViewType: UIView>: UIViewRepresentable {
|
||||||
|
|
||||||
|
/// Method that introspects the view hierarchy to find the target view.
|
||||||
|
/// First argument is the introspection view itself, which is contained in a view host alongside the target view.
|
||||||
|
let selector: (IntrospectionUIView) -> TargetViewType?
|
||||||
|
|
||||||
|
/// User-provided customization method for the target view.
|
||||||
|
let customize: (TargetViewType) -> Void
|
||||||
|
|
||||||
|
public init(
|
||||||
|
selector: @escaping (IntrospectionUIView) -> TargetViewType?,
|
||||||
|
customize: @escaping (TargetViewType) -> Void
|
||||||
|
) {
|
||||||
|
self.selector = selector
|
||||||
|
self.customize = customize
|
||||||
|
}
|
||||||
|
|
||||||
|
public func makeUIView(context: UIViewRepresentableContext<UIKitIntrospectionView>) -> IntrospectionUIView {
|
||||||
|
let view = IntrospectionUIView()
|
||||||
|
view.accessibilityLabel = "IntrospectionUIView<\(TargetViewType.self)>"
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
/// When `updateUiView` is called after creating the Introspection view, it is not yet in the UIKit hierarchy.
|
||||||
|
/// At this point, `introspectionView.superview.superview` is nil and we can't access the target UIKit view.
|
||||||
|
/// To workaround this, we wait until the runloop is done inserting the introspection view in the hierarchy, then run the selector.
|
||||||
|
/// Finding the target view fails silently if the selector yield no result. This happens when `updateUIView`
|
||||||
|
/// gets called when the introspection view gets removed from the hierarchy.
|
||||||
|
public func updateUIView(
|
||||||
|
_ uiView: IntrospectionUIView,
|
||||||
|
context: UIViewRepresentableContext<UIKitIntrospectionView>
|
||||||
|
) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
guard let targetView = self.selector(uiView) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.customize(targetView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,53 @@
|
||||||
|
#if canImport(UIKit)
|
||||||
|
import SwiftUI
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
/// Introspection UIViewController that is inserted alongside the target view controller.
|
||||||
|
public class IntrospectionUIViewController: UIViewController {
|
||||||
|
required init() {
|
||||||
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
view = IntrospectionUIView()
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, unavailable)
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This is the same logic as IntrospectionView but for view controllers. Please see details above.
|
||||||
|
public struct UIKitIntrospectionViewController<TargetViewControllerType: UIViewController>: UIViewControllerRepresentable {
|
||||||
|
|
||||||
|
let selector: (IntrospectionUIViewController) -> TargetViewControllerType?
|
||||||
|
let customize: (TargetViewControllerType) -> Void
|
||||||
|
|
||||||
|
public init(
|
||||||
|
selector: @escaping (UIViewController) -> TargetViewControllerType?,
|
||||||
|
customize: @escaping (TargetViewControllerType) -> Void
|
||||||
|
) {
|
||||||
|
self.selector = selector
|
||||||
|
self.customize = customize
|
||||||
|
}
|
||||||
|
|
||||||
|
public func makeUIViewController(
|
||||||
|
context: UIViewControllerRepresentableContext<UIKitIntrospectionViewController>
|
||||||
|
) -> IntrospectionUIViewController {
|
||||||
|
let viewController = IntrospectionUIViewController()
|
||||||
|
viewController.accessibilityLabel = "IntrospectionUIViewController<\(TargetViewControllerType.self)>"
|
||||||
|
viewController.view.accessibilityLabel = "IntrospectionUIView<\(TargetViewControllerType.self)>"
|
||||||
|
return viewController
|
||||||
|
}
|
||||||
|
|
||||||
|
public func updateUIViewController(
|
||||||
|
_ uiViewController: IntrospectionUIViewController,
|
||||||
|
context: UIViewControllerRepresentableContext<UIKitIntrospectionViewController>
|
||||||
|
) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
guard let targetView = self.selector(uiViewController) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.customize(targetView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,166 @@
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
#if canImport(AppKit)
|
||||||
|
import AppKit
|
||||||
|
#elseif canImport(UIKit)
|
||||||
|
import UIKit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extension View {
|
||||||
|
public func inject<SomeView>(_ view: SomeView) -> some View where SomeView: View {
|
||||||
|
return overlay(view.frame(width: 0, height: 0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if canImport(UIKit)
|
||||||
|
extension View {
|
||||||
|
|
||||||
|
/// Finds a `TargetView` from a `SwiftUI.View`
|
||||||
|
public func introspect<TargetView: UIView>(
|
||||||
|
selector: @escaping (IntrospectionUIView) -> TargetView?,
|
||||||
|
customize: @escaping (TargetView) -> ()
|
||||||
|
) -> some View {
|
||||||
|
return inject(UIKitIntrospectionView(
|
||||||
|
selector: selector,
|
||||||
|
customize: customize
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UINavigationController` from any view embedded in a `SwiftUI.NavigationView`.
|
||||||
|
public func introspectNavigationController(customize: @escaping (UINavigationController) -> ()) -> some View {
|
||||||
|
return inject(UIKitIntrospectionViewController(
|
||||||
|
selector: { introspectionViewController in
|
||||||
|
|
||||||
|
// Search in ancestors
|
||||||
|
if let navigationController = introspectionViewController.navigationController {
|
||||||
|
return navigationController
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search in siblings
|
||||||
|
return Introspect.previousSibling(containing: UINavigationController.self, from: introspectionViewController)
|
||||||
|
},
|
||||||
|
customize: customize
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds the containing `UIViewController` of a SwiftUI view.
|
||||||
|
public func introspectViewController(customize: @escaping (UIViewController) -> ()) -> some View {
|
||||||
|
return inject(UIKitIntrospectionViewController(
|
||||||
|
selector: { $0.parent },
|
||||||
|
customize: customize
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UITabBarController` from any SwiftUI view embedded in a `SwiftUI.TabView`
|
||||||
|
public func introspectTabBarController(customize: @escaping (UITabBarController) -> ()) -> some View {
|
||||||
|
return inject(UIKitIntrospectionViewController(
|
||||||
|
selector: { introspectionViewController in
|
||||||
|
|
||||||
|
// Search in ancestors
|
||||||
|
if let navigationController = introspectionViewController.tabBarController {
|
||||||
|
return navigationController
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search in siblings
|
||||||
|
return Introspect.previousSibling(ofType: UITabBarController.self, from: introspectionViewController)
|
||||||
|
},
|
||||||
|
customize: customize
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UITableView` from a `SwiftUI.List`, or `SwiftUI.List` child.
|
||||||
|
public func introspectTableView(customize: @escaping (UITableView) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.ancestorOrSibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UIScrollView` from a `SwiftUI.ScrollView`, or `SwiftUI.ScrollView` child.
|
||||||
|
public func introspectScrollView(customize: @escaping (UIScrollView) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.ancestorOrSibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UITextField` from a `SwiftUI.TextField`
|
||||||
|
public func introspectTextField(customize: @escaping (UITextField) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UISwitch` from a `SwiftUI.Toggle`
|
||||||
|
@available(tvOS, unavailable)
|
||||||
|
public func introspectSwitch(customize: @escaping (UISwitch) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UISlider` from a `SwiftUI.Slider`
|
||||||
|
@available(tvOS, unavailable)
|
||||||
|
public func introspectSlider(customize: @escaping (UISlider) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UIStepper` from a `SwiftUI.Stepper`
|
||||||
|
@available(tvOS, unavailable)
|
||||||
|
public func introspectStepper(customize: @escaping (UIStepper) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UIDatePicker` from a `SwiftUI.DatePicker`
|
||||||
|
@available(tvOS, unavailable)
|
||||||
|
public func introspectDatePicker(customize: @escaping (UIDatePicker) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `UISegmentedControl` from a `SwiftUI.Picker` with style `SegmentedPickerStyle`
|
||||||
|
public func introspectSegmentedControl(customize: @escaping (UISegmentedControl) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if canImport(AppKit)
|
||||||
|
extension View {
|
||||||
|
|
||||||
|
/// Finds a `TargetView` from a `SwiftUI.View`
|
||||||
|
public func introspect<TargetView: NSView>(
|
||||||
|
selector: @escaping (IntrospectionNSView) -> TargetView?,
|
||||||
|
customize: @escaping (TargetView) -> ()
|
||||||
|
) -> some View {
|
||||||
|
return inject(AppKitIntrospectionView(
|
||||||
|
selector: selector,
|
||||||
|
customize: customize
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSTableView` from a `SwiftUI.List`, or `SwiftUI.List` child.
|
||||||
|
public func introspectTableView(customize: @escaping (NSTableView) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.ancestorOrSibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSScrollView` from a `SwiftUI.ScrollView`, or `SwiftUI.ScrollView` child.
|
||||||
|
public func introspectScrollView(customize: @escaping (NSScrollView) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.ancestorOrSibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSTextField` from a `SwiftUI.TextField`
|
||||||
|
public func introspectTextField(customize: @escaping (NSTextField) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSSlider` from a `SwiftUI.Slider`
|
||||||
|
public func introspectSlider(customize: @escaping (NSSlider) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSStepper` from a `SwiftUI.Stepper`
|
||||||
|
public func introspectStepper(customize: @escaping (NSStepper) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSDatePicker` from a `SwiftUI.DatePicker`
|
||||||
|
public func introspectDatePicker(customize: @escaping (NSDatePicker) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Finds a `NSSegmentedControl` from a `SwiftUI.Picker` with style `SegmentedPickerStyle`
|
||||||
|
public func introspectSegmentedControl(customize: @escaping (NSSegmentedControl) -> ()) -> some View {
|
||||||
|
return introspect(selector: TargetViewSelector.sibling, customize: customize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -1,98 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "20x20",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "20x20",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "60x60",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "60x60",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "20x20",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "20x20",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "76x76",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "76x76",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "83.5x83.5",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ios-marketing",
|
|
||||||
"size" : "1024x1024",
|
|
||||||
"scale" : "1x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
|
||||||
<dependencies>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
|
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
|
||||||
</dependencies>
|
|
||||||
<scenes>
|
|
||||||
<!--View Controller-->
|
|
||||||
<scene sceneID="EHf-IW-A2E">
|
|
||||||
<objects>
|
|
||||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
|
||||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
|
||||||
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
|
||||||
</view>
|
|
||||||
</viewController>
|
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
|
||||||
</objects>
|
|
||||||
<point key="canvasLocation" x="53" y="375"/>
|
|
||||||
</scene>
|
|
||||||
</scenes>
|
|
||||||
</document>
|
|
|
@ -15,7 +15,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.0</string>
|
<string>0.0.6</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
#if canImport(AppKit)
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
import SwiftUI
|
||||||
|
@testable import Introspect
|
||||||
|
|
||||||
|
enum TestUtils {
|
||||||
|
static func present<ViewType: View>(view: ViewType) {
|
||||||
|
|
||||||
|
let window = NSWindow(
|
||||||
|
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
|
||||||
|
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
|
||||||
|
backing: .buffered, defer: false)
|
||||||
|
window.center()
|
||||||
|
window.setFrameAutosaveName("Main Window")
|
||||||
|
window.contentView = NSHostingView(rootView: view)
|
||||||
|
window.makeKeyAndOrderFront(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct ListTestView: View {
|
||||||
|
|
||||||
|
let spy1: () -> Void
|
||||||
|
let spy2: () -> Void
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
List {
|
||||||
|
Text("Item 1")
|
||||||
|
Text("Item 2")
|
||||||
|
.introspectTableView { tableView in
|
||||||
|
self.spy2()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.introspectTableView { tableView in
|
||||||
|
self.spy1()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct ScrollTestView: View {
|
||||||
|
|
||||||
|
let spy1: () -> Void
|
||||||
|
let spy2: () -> Void
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack {
|
||||||
|
ScrollView {
|
||||||
|
Text("Item 1")
|
||||||
|
}
|
||||||
|
.introspectScrollView { scrollView in
|
||||||
|
self.spy1()
|
||||||
|
}
|
||||||
|
ScrollView {
|
||||||
|
Text("Item 1")
|
||||||
|
.introspectScrollView { scrollView in
|
||||||
|
self.spy2()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct TextFieldTestView: View {
|
||||||
|
let spy: () -> Void
|
||||||
|
@State private var textFieldValue = ""
|
||||||
|
var body: some View {
|
||||||
|
TextField("Text Field", text: $textFieldValue)
|
||||||
|
.introspectTextField { textField in
|
||||||
|
self.spy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct SliderTestView: View {
|
||||||
|
let spy: () -> Void
|
||||||
|
@State private var sliderValue = 0.0
|
||||||
|
var body: some View {
|
||||||
|
Slider(value: $sliderValue, in: 0...100)
|
||||||
|
.introspectSlider { slider in
|
||||||
|
self.spy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct StepperTestView: View {
|
||||||
|
let spy: () -> Void
|
||||||
|
var body: some View {
|
||||||
|
Stepper(onIncrement: {}, onDecrement: {}) {
|
||||||
|
Text("Stepper")
|
||||||
|
}
|
||||||
|
.introspectStepper { stepper in
|
||||||
|
self.spy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct DatePickerTestView: View {
|
||||||
|
let spy: () -> Void
|
||||||
|
@State private var datePickerValue = Date()
|
||||||
|
var body: some View {
|
||||||
|
DatePicker(selection: $datePickerValue) {
|
||||||
|
Text("DatePicker")
|
||||||
|
}
|
||||||
|
.introspectDatePicker { datePicker in
|
||||||
|
self.spy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct SegmentedControlTestView: View {
|
||||||
|
@State private var pickerValue = 0
|
||||||
|
let spy: () -> Void
|
||||||
|
var body: some View {
|
||||||
|
Picker(selection: $pickerValue, label: Text("Segmented control")) {
|
||||||
|
Text("Option 1").tag(0)
|
||||||
|
Text("Option 2").tag(1)
|
||||||
|
Text("Option 3").tag(2)
|
||||||
|
}
|
||||||
|
.pickerStyle(SegmentedPickerStyle())
|
||||||
|
.introspectSegmentedControl { segmentedControl in
|
||||||
|
self.spy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppKitTests: XCTestCase {
|
||||||
|
|
||||||
|
func testList() {
|
||||||
|
|
||||||
|
let expectation1 = XCTestExpectation()
|
||||||
|
let expectation2 = XCTestExpectation()
|
||||||
|
let view = ListTestView(
|
||||||
|
spy1: { expectation1.fulfill() },
|
||||||
|
spy2: { expectation2.fulfill() }
|
||||||
|
)
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation1, expectation2], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testScrollView() {
|
||||||
|
|
||||||
|
let expectation1 = XCTestExpectation()
|
||||||
|
let expectation2 = XCTestExpectation()
|
||||||
|
let view = ScrollTestView(
|
||||||
|
spy1: { expectation1.fulfill() },
|
||||||
|
spy2: { expectation2.fulfill() }
|
||||||
|
)
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation1, expectation2], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testTextField() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = TextFieldTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testSlider() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = SliderTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testStepper() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = StepperTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testDatePicker() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = DatePickerTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testSegmentedControl() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = SegmentedControlTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -15,7 +15,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.0</string>
|
<string>0.0.6</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
import Foundation
|
|
||||||
import UIKit
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
enum TestUtils {
|
|
||||||
static func present<ViewType: View>(view: ViewType) {
|
|
||||||
|
|
||||||
let hostingController = UIHostingController(rootView: view)
|
|
||||||
|
|
||||||
let application = UIApplication.shared
|
|
||||||
application.windows.forEach { window in
|
|
||||||
if let presentedViewController = window.rootViewController?.presentedViewController {
|
|
||||||
presentedViewController.dismiss(animated: false, completion: nil)
|
|
||||||
}
|
|
||||||
window.isHidden = true
|
|
||||||
}
|
|
||||||
|
|
||||||
let window = UIWindow(frame: UIScreen.main.bounds)
|
|
||||||
window.layer.speed = 10
|
|
||||||
|
|
||||||
hostingController.beginAppearanceTransition(true, animated: false)
|
|
||||||
window.rootViewController = hostingController
|
|
||||||
window.makeKeyAndVisible()
|
|
||||||
hostingController.endAppearanceTransition()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +1,32 @@
|
||||||
|
#if canImport(UIKit)
|
||||||
import XCTest
|
import XCTest
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
@testable import Introspect
|
@testable import Introspect
|
||||||
|
|
||||||
|
enum TestUtils {
|
||||||
|
static func present<ViewType: View>(view: ViewType) {
|
||||||
|
|
||||||
|
let hostingController = UIHostingController(rootView: view)
|
||||||
|
|
||||||
|
let application = UIApplication.shared
|
||||||
|
application.windows.forEach { window in
|
||||||
|
if let presentedViewController = window.rootViewController?.presentedViewController {
|
||||||
|
presentedViewController.dismiss(animated: false, completion: nil)
|
||||||
|
}
|
||||||
|
window.isHidden = true
|
||||||
|
}
|
||||||
|
|
||||||
|
let window = UIWindow(frame: UIScreen.main.bounds)
|
||||||
|
window.layer.speed = 10
|
||||||
|
|
||||||
|
hostingController.beginAppearanceTransition(true, animated: false)
|
||||||
|
window.rootViewController = hostingController
|
||||||
|
window.makeKeyAndVisible()
|
||||||
|
hostingController.endAppearanceTransition()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private struct NavigationTestView: View {
|
private struct NavigationTestView: View {
|
||||||
let spy: () -> Void
|
let spy: () -> Void
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
@ -126,6 +150,7 @@ private struct TextFieldTestView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@available(tvOS, unavailable)
|
||||||
private struct ToggleTestView: View {
|
private struct ToggleTestView: View {
|
||||||
let spy: () -> Void
|
let spy: () -> Void
|
||||||
@State private var toggleValue = false
|
@State private var toggleValue = false
|
||||||
|
@ -137,6 +162,7 @@ private struct ToggleTestView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@available(tvOS, unavailable)
|
||||||
private struct SliderTestView: View {
|
private struct SliderTestView: View {
|
||||||
let spy: () -> Void
|
let spy: () -> Void
|
||||||
@State private var sliderValue = 0.0
|
@State private var sliderValue = 0.0
|
||||||
|
@ -148,6 +174,7 @@ private struct SliderTestView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@available(tvOS, unavailable)
|
||||||
private struct StepperTestView: View {
|
private struct StepperTestView: View {
|
||||||
let spy: () -> Void
|
let spy: () -> Void
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
@ -160,6 +187,7 @@ private struct StepperTestView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@available(tvOS, unavailable)
|
||||||
private struct DatePickerTestView: View {
|
private struct DatePickerTestView: View {
|
||||||
let spy: () -> Void
|
let spy: () -> Void
|
||||||
@State private var datePickerValue = Date()
|
@State private var datePickerValue = Date()
|
||||||
|
@ -189,7 +217,7 @@ private struct SegmentedControlTestView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class IntrospectTests: XCTestCase {
|
class UIKitTests: XCTestCase {
|
||||||
func testNavigation() {
|
func testNavigation() {
|
||||||
|
|
||||||
let expectation = XCTestExpectation()
|
let expectation = XCTestExpectation()
|
||||||
|
@ -210,16 +238,6 @@ class IntrospectTests: XCTestCase {
|
||||||
wait(for: [expectation], timeout: 1)
|
wait(for: [expectation], timeout: 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testRootNavigation() {
|
|
||||||
|
|
||||||
let expectation = XCTestExpectation()
|
|
||||||
let view = NavigationRootTestView(spy: {
|
|
||||||
expectation.fulfill()
|
|
||||||
})
|
|
||||||
TestUtils.present(view: view)
|
|
||||||
wait(for: [expectation], timeout: 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testTabView() {
|
func testTabView() {
|
||||||
|
|
||||||
let expectation = XCTestExpectation()
|
let expectation = XCTestExpectation()
|
||||||
|
@ -274,6 +292,27 @@ class IntrospectTests: XCTestCase {
|
||||||
wait(for: [expectation], timeout: 1)
|
wait(for: [expectation], timeout: 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testSegmentedControl() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = SegmentedControlTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
func testRootNavigation() {
|
||||||
|
|
||||||
|
let expectation = XCTestExpectation()
|
||||||
|
let view = NavigationRootTestView(spy: {
|
||||||
|
expectation.fulfill()
|
||||||
|
})
|
||||||
|
TestUtils.present(view: view)
|
||||||
|
wait(for: [expectation], timeout: 1)
|
||||||
|
}
|
||||||
|
|
||||||
func testToggle() {
|
func testToggle() {
|
||||||
|
|
||||||
let expectation = XCTestExpectation()
|
let expectation = XCTestExpectation()
|
||||||
|
@ -313,14 +352,6 @@ class IntrospectTests: XCTestCase {
|
||||||
TestUtils.present(view: view)
|
TestUtils.present(view: view)
|
||||||
wait(for: [expectation], timeout: 1)
|
wait(for: [expectation], timeout: 1)
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
func testSegmentedControl() {
|
|
||||||
|
|
||||||
let expectation = XCTestExpectation()
|
|
||||||
let view = SegmentedControlTestView(spy: {
|
|
||||||
expectation.fulfill()
|
|
||||||
})
|
|
||||||
TestUtils.present(view: view)
|
|
||||||
wait(for: [expectation], timeout: 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#endif
|
|
@ -5,7 +5,7 @@ import PackageDescription
|
||||||
let package = Package(
|
let package = Package(
|
||||||
name: "Introspect",
|
name: "Introspect",
|
||||||
platforms: [
|
platforms: [
|
||||||
.iOS(.v13)
|
.macOS(.v10_15), .iOS(.v13), .tvOS(.v13)
|
||||||
],
|
],
|
||||||
products: [
|
products: [
|
||||||
.library(
|
.library(
|
||||||
|
@ -19,6 +19,11 @@ let package = Package(
|
||||||
name: "Introspect",
|
name: "Introspect",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
path: "Introspect"
|
path: "Introspect"
|
||||||
|
),
|
||||||
|
.testTarget(
|
||||||
|
name: "IntrospectTests",
|
||||||
|
dependencies: ["Introspect"],
|
||||||
|
path: "IntrospectTests"
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
53
README.md
53
README.md
|
@ -3,7 +3,7 @@ Introspect for SwiftUI
|
||||||
|
|
||||||
[](https://circleci.com/gh/siteline/SwiftUI-Introspect)
|
[](https://circleci.com/gh/siteline/SwiftUI-Introspect)
|
||||||
|
|
||||||
Introspect allows you to get the underlying UIKit element of a SwiftUI view.
|
Introspect allows you to get the underlying UIKit or AppKit element of a SwiftUI view.
|
||||||
|
|
||||||
For instance, with Introspect you can access `UITableView` to modify separators, or `UINavigationController` to customize the tab bar.
|
For instance, with Introspect you can access `UITableView` to modify separators, or `UINavigationController` to customize the tab bar.
|
||||||
|
|
||||||
|
@ -47,19 +47,19 @@ Introspection
|
||||||
|
|
||||||
### Implemented
|
### Implemented
|
||||||
|
|
||||||
SwiftUI | UIKit | Introspect | Target
|
SwiftUI | UIKit | AppKit | Introspect
|
||||||
--- | --- | --- | ---
|
--- | --- | --- | --- | ---
|
||||||
List | UITableView | `.introspectTableView()` | List, or List child
|
List | UITableView | NSTableView | `.introspectTableView()`
|
||||||
ScrollView | UIScrollView | `.introspectScrollView()` | ScrollView, or ScrollView child
|
ScrollView | UIScrollView | NSScrollView | `.introspectScrollView()`
|
||||||
NavigationView | UINavigationController | `.introspectNavigationController()` | NavigationView, or NavigationView child
|
NavigationView | UINavigationController | _N/A_ | `.introspectNavigationController()`
|
||||||
_Any embedded view_ | UIViewController | `.introspectViewController()` | View embedded in a view controller
|
_Any embedded view_ | UIViewController | _N/A_ | `.introspectViewController()`
|
||||||
TabView | UITabBarController | `.introspectTabBarController()` | TabView, or TabView child
|
TabView | UITabBarController | _N/A_ | `.introspectTabBarController()`
|
||||||
TextField | UITextField | `.introspectTextField()` | TextField
|
TextField | UITextField | NSTextField | `.introspectTextField()`
|
||||||
Toggle | UISwitch | `.introspectSwitch()` | Toggle
|
Toggle | UISwitch | N/A | `.introspectSwitch()`
|
||||||
Slider | UISlider | `.introspectSlider()` | Slider
|
Slider | UISlider | NSSlider | `.introspectSlider()`
|
||||||
Stepper | UIStepper | `.introspectStepper()` | Stepper
|
Stepper | UIStepper | NSStepper | `.introspectStepper()`
|
||||||
DatePicker | UIDatePicker | `.introspectDatePicker()` | DatePicker
|
DatePicker | UIDatePicker | NSDatePicker | `.introspectDatePicker()`
|
||||||
Picker (SegmentedPickerStyle) | UISegmentedControl | `.introspectSegmentedControl()` | Picker
|
Picker (SegmentedPickerStyle) | UISegmentedControl | NSSegmentedControl | `.introspectSegmentedControl()`
|
||||||
|
|
||||||
**Missing an element?** Please [create an issue](https://github.com/timbersoftware/SwiftUI-Introspect/issues). As a temporary solution, you can [implement your own selector](#implement-your-own-selector).
|
**Missing an element?** Please [create an issue](https://github.com/timbersoftware/SwiftUI-Introspect/issues). As a temporary solution, you can [implement your own selector](#implement-your-own-selector).
|
||||||
|
|
||||||
|
@ -148,3 +148,28 @@ You can use any of the following [methods](https://github.com/timbersoftware/Swi
|
||||||
- `Introspect.findAncestor(ofType:from:)`
|
- `Introspect.findAncestor(ofType:from:)`
|
||||||
- `Introspect.findHostingView(from:)`
|
- `Introspect.findHostingView(from:)`
|
||||||
- `Introspect.findViewHost(from:)`
|
- `Introspect.findViewHost(from:)`
|
||||||
|
|
||||||
|
Releasing
|
||||||
|
---------
|
||||||
|
|
||||||
|
- Increment version number:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bundle exec fastlane run increment_version_number bump_type:minor # major|minor|patch
|
||||||
|
```
|
||||||
|
|
||||||
|
- Update changelog with new version
|
||||||
|
- Bump version in `Introspect.podspec`
|
||||||
|
- Commit and push changes
|
||||||
|
- Tag new version:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git tag -a <VERSION> -m "<MESSAGE>"
|
||||||
|
$ git push origin --tags
|
||||||
|
```
|
||||||
|
|
||||||
|
- Push to cocoapods trunk:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bundle exec pod trunk push .
|
||||||
|
```
|
||||||
|
|
|
@ -1,9 +1,24 @@
|
||||||
default_platform(:ios)
|
default_platform(:ios)
|
||||||
skip_docs
|
skip_docs
|
||||||
|
|
||||||
lane :test do
|
platform :ios do
|
||||||
scan(
|
lane :test do
|
||||||
devices: ["iPhone 8"],
|
scan(
|
||||||
scheme: "Introspect"
|
devices: ["iPhone 8"],
|
||||||
)
|
scheme: "Introspect iOS"
|
||||||
|
)
|
||||||
|
|
||||||
|
scan(
|
||||||
|
devices: ["Apple TV"],
|
||||||
|
scheme: "Introspect tvOS"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
platform :mac do
|
||||||
|
lane :test do
|
||||||
|
scan(
|
||||||
|
scheme: "Introspect macOS"
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue