Repository: iberHK/react-native-picker Branch: master Commit: 75e5e5977823 Files: 56 Total size: 314.0 KB Directory structure: gitextract_u6l0pbhq/ ├── .gitattributes ├── .gitignore ├── CustomPicker.js ├── README.md ├── example/ │ ├── __tests__/ │ │ └── App.js │ ├── android/ │ │ ├── app/ │ │ │ ├── BUCK │ │ │ ├── build.gradle │ │ │ ├── proguard-rules.pro │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pickers/ │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── res/ │ │ │ └── values/ │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── keystores/ │ │ │ ├── BUCK │ │ │ └── debug.keystore.properties │ │ └── settings.gradle │ ├── app.json │ ├── index.js │ ├── ios/ │ │ ├── pickers/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Base.lproj/ │ │ │ │ └── LaunchScreen.xib │ │ │ ├── Images.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Info.plist │ │ │ └── main.m │ │ ├── pickers-tvOS/ │ │ │ └── Info.plist │ │ ├── pickers-tvOSTests/ │ │ │ └── Info.plist │ │ ├── pickers.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ ├── pickers-tvOS.xcscheme │ │ │ └── pickers.xcscheme │ │ └── pickersTests/ │ │ ├── Info.plist │ │ └── pickersTests.m │ ├── package.json │ └── src/ │ ├── Area.json │ └── MainPage.js ├── index.js ├── package.json ├── utils/ │ └── TimeUtils.js └── view/ ├── AlertDialog.js ├── AreaPicker.js ├── BaseComponent.js ├── BaseDialog.js ├── DatePicker.js ├── DownloadDialog.js ├── InputDialog.js ├── KeyboardSpacer.js ├── PickerView.js ├── SimpleChooseDialog.js ├── SimpleItemsDialog.js └── ToastComponent.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.m linguist-language=javascript *.h linguist-language=javascript ================================================ FILE: .gitignore ================================================ # OSX # .DS_Store # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate project.xcworkspace # Android/IntelliJ # build/ .idea .gradle local.properties *.iml # node.js # node_modules/ npm-debug.log yarn-error.log # BUCK buck-out/ \.buckd/ *.keystore # fastlane # # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the # screenshots whenever they are needed. # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/ */fastlane/report.xml */fastlane/Preview.html */fastlane/screenshots ================================================ FILE: CustomPicker.js ================================================ import React, { Component } from 'react'; import { View, Text, StatusBar, TouchableOpacity, Platform, Dimensions, PixelRatio } from 'react-native'; import BaseDialog from './view/BaseDialog'; import PickerView from './view/PickerView'; export default class CustomPicker extends BaseDialog { static defaultProps = { list: ['item0', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9'], list1: ['item10', 'item11', 'item12', 'item13', 'item14', 'item15', 'item16', 'item17', 'item18', 'item19'] } constructor(props) { super(props); } _getContentPosition() { return { justifyContent: 'flex-end', alignItems: 'center' } } renderContent() { return { // console.warn(toValue) }} selectedIndex={0} fontSize={this.getSize(14)} itemWidth={this.mScreenWidth / 2} itemHeight={this.getSize(40)} /> { // console.warn(toValue) }} selectedIndex={0} fontSize={this.getSize(14)} itemWidth={this.mScreenWidth / 2} itemHeight={this.getSize(40)} /> } } ================================================ FILE: README.md ================================================ # react-native-pickers 纯JS实现Picker,还是有点难度的,需要涉及到RN的性能优化(联动不能使用setState来更新)、 自定义手势、自定义点击以及动画等。
其他Dialog只是因为Picker是基于项目的BaseDialog扩展来的,就一并整理发布。
![img](https://github.com/iberHK/react-native-pickers/blob/master/screenshot/demo2.gif?raw=true) ### 安装: yarn add react-native-pickers
yarn add react-native-svg
react-native link react-native-svg
### 使用:
  • AreaPicker:

  • 属性 默认值 描述 截图
    selectedValue ['香港', '香港', '中西區'] 选中
    areaJson null 地址数据源
    confirmText '确定' 确定选择文本
    confirmTextSize 14 确定选择文本字体大小
    confirmTextColor '#333333' 确定选择字体颜色
    cancelText '取消' 取消选择文本
    cancelTextSize 14 取消选择文本字体大小
    cancelTextColor '#333333' 取消选择文本字体颜色
    itemTextColor 0x333333ff item正常颜色,仅支持16进制数字
    itemSelectedColor 0x1097D5ff item选择颜色,仅支持16进制数字
    itemHeight 40 item高度
    onPickerCancel null 取消选择回调
    onPickerConfirm null 确认选择回调

  • DatePicker:

  • 属性 默认值 描述 截图
    itemTextColor 0x333333ff item正常颜色,仅支持16进制数字
    itemSelectedColor 0x1097D5ff item选择颜色,仅支持16进制数字
    onPickerCancel null 取消选择回调
    onPickerConfirm null 确认选择回调
    unit ['年', '月', '日'] 单位
    selectedValue [ new Date().getFullYear() + '年',
    new Date().getMonth() + 1 + '月',
    new Date().getDate() + '日']
    选中
    startYear 1990 起始年份
    endYear new Date().getFullYear() 截至年份
    cancelText '取消' 取消选择文本
    cancelTextSize 14 取消选择文本字体大小
    cancelTextColor '#333333' 取消选择文本字体颜色
    itemTextColor 0x333333ff item正常颜色,仅支持16进制数字
    itemSelectedColor 0x1097D5ff item选择颜色,仅支持16进制数字
    onPickerCancel null 取消选择回调
    onPickerConfirm null 确认选择回调
    confirmText '确定' 确定选择文本
    confirmTextSize 14 确定选择文本字体大小
    confirmTextColor '#333333' 确定选择字体颜色
    cancelText '取消' 取消选择文本
    cancelTextSize 14 取消选择文本字体大小
    cancelTextColor '#333333' 取消选择文本字体颜色
    itemHeight 40 item高度
    HH true 是否显示小时
    mm true 是否显示分钟
    xx false 是否显示秒

  • AlertDialog:

  • 属性 默认值 描述 截图
    messageText 'Alert Message' 消息文本
    messageTextColor '#444444' 消息文本字体颜色
    messageTextSize 14 消息文本字体大小
    negativeText 'cancel' 取消文本
    negativeColor '#666666' 取消文本颜色
    negativeSize 16 取消文本字体大小
    positiveText 'ok' 确定文本
    positiveColor '#1097D5' 确定文本颜色
    positiveSize 16 确定文本字体大小
    onPress null positive(确定)返回true or negative(取消)返回false

  • SimpleItemsDialog:

  • 属性 默认值 描述 截图
    items ['a', 'b', 'c'] 列表数据,可以string、object(需要指定itemKey)
    itemKey 'key' 当item为object时,来指定显示的属性
    items:[{id:0, value: 'v1'},{id:0, value: 'v1'}]
    itemKey设为'value',则等同于['v1', 'v2']
    itemStyle {
    fontSize: 14,
    fontWeight: '400',
    color: '#333333'
    }
    列表文字样式
    cancel true 是否在列表最后 增加 ‘取消’ 项
    cancelText '取消' 取消项文本
    cancelTextStyle {
    fontSize: 14,
    fontWeight: '400',
    color: '#999999'
    }
    取消文本字体样式
    onPress null 返回选中index

  • SimpleChooseDialog:

  • 属性 默认值 描述 截图
    items ['a', 'b', 'c'] 列表数据,可以string、object
    (需要指定itemKey)
    itemKey 'key' 当item为object时,来指定显示的属性
    items:[{id:0, value: 'v1'},{id:0, value: 'v1'}]
    itemKey设为'value',则等同于
    ['v1', 'v2']
    itemStyle {
    fontSize: 14,
    fontWeight: '400',
    color: '#333333'
    }
    列表文字样式
    selectColor '#1097D5' 选中颜色
    normalColor '#666666' 未选中颜色
    pointSize 18 左侧选中标识大小
    pointBorderRadius 9 左侧选中标识边框弧度
    confirmText '确定' 确定选择文本
    confirmBtnColor '#1097D5' 确定选择按钮颜色
    confirmTextColor '#ffffff' 确定选择文本颜色
    onPress null 返回选中index

  • InputDialog:

  • 属性 默认值 描述 截图
    title '我要举报' 标题文本
    titleSize 16 标题文本字体大小
    titleColor '#333333' 标题文本文本颜色
    cancelText '返回' 取消文本
    cancelSize 14 取消文本字体大小
    cancelColor '#333333' 取消文本字体颜色
    btnText '提交' 提交文本
    btnTextSize 12 提交文本字体大小
    btnTextColor '#ffffff' 提交文本字体颜色
    btnBgColor '#1097D5' 提交按钮颜色
    placeholder '请尽量说明问题,我们将尽快处理...' 输入框提示语
    onSubmit null 返回输入的文本内容
    InputDialog.show(text),显示dialog,text:用于编辑时,设置前值

  • DownloadDialog:

  • 属性 默认值 描述 截图
    title '视频下载' 标题文本
    titleSize 16 标题文本字体大小
    titleColor '#333333' 标题文本文本颜色
    active false 按钮是否可点击
    actionText '打开' 按钮文本
    onAction null 点击按钮回调
    totalTextColor '#666666' 总数文本字体颜色
    totalTextSize 12 总数文本字体大小
    DownloadDialog.setProcess(0, '4.24MB'),设置当前进度,及下载文件总数

  • ToastComponent:

  • 属性 默认值 描述 截图
    duration 1500 显示时长(自动隐藏)
    fontSize 14 message字体大小
    textColor '#ffffff' message字体颜色
    lineHeight 20 message字体行高
    paddingH 10 水平padding
    paddingV 5 上下padding
    borderRadius 5 背景圆角
    backgroundColor 0x00000099 背景颜色
    ToastComponent.show('message'),显示‘message’toast。应放在navigation同层,全局唯一

  • BaseDialog:

  • 属性 默认值 描述
    removeSubviews true dismiss,是否回收前景控件,拓展出来的子控件,不要动态设置改属性
    coverClickable ture 背景点击隐藏
    onCoverPress null 点击背景,dismiss回调
    showAnimationType null 入场动画方式 spring timing

  • PickerView:

  • 属性 默认值 描述
    itemTextColor 0x333333ff item正常颜色,仅支持16进制数字
    itemSelectedColor 0x1097D5ff item选择颜色,仅支持16进制数字
    itemHeight 40 item高度
    onPickerSelected null 选中时回调
    selectedIndex 0 选中
    ================================================ FILE: example/__tests__/App.js ================================================ import 'react-native'; import React from 'react'; import App from '../App'; // Note: test renderer must be required after react-native. import renderer from 'react-test-renderer'; it('renders correctly', () => { const tree = renderer.create( ); }); ================================================ FILE: example/android/app/BUCK ================================================ # To learn about Buck see [Docs](https://buckbuild.com/). # To run your application with Buck: # - install Buck # - `npm start` - to start the packager # - `cd android` # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck # - `buck install -r android/app` - compile, install and run application # lib_deps = [] for jarfile in glob(['libs/*.jar']): name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')] lib_deps.append(':' + name) prebuilt_jar( name = name, binary_jar = jarfile, ) for aarfile in glob(['libs/*.aar']): name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] lib_deps.append(':' + name) android_prebuilt_aar( name = name, aar = aarfile, ) android_library( name = "all-libs", exported_deps = lib_deps, ) android_library( name = "app-code", srcs = glob([ "src/main/java/**/*.java", ]), deps = [ ":all-libs", ":build_config", ":res", ], ) android_build_config( name = "build_config", package = "com.pickers", ) android_resource( name = "res", package = "com.pickers", res = "src/main/res", ) android_binary( name = "app", keystore = "//android/keystores:debug", manifest = "src/main/AndroidManifest.xml", package_type = "debug", deps = [ ":app-code", ], ) ================================================ FILE: example/android/app/build.gradle ================================================ apply plugin: "com.android.application" import com.android.build.OutputFile /** * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets * and bundleReleaseJsAndAssets). * These basically call `react-native bundle` with the correct arguments during the Android build * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the * bundle directly from the development server. Below you can see all the possible configurations * and their defaults. If you decide to add a configuration block, make sure to add it before the * `apply from: "../../node_modules/react-native/react.gradle"` line. * * project.ext.react = [ * // the name of the generated asset file containing your JS bundle * bundleAssetName: "index.android.bundle", * * // the entry file for bundle generation * entryFile: "index.android.js", * * // whether to bundle JS and assets in debug mode * bundleInDebug: false, * * // whether to bundle JS and assets in release mode * bundleInRelease: true, * * // whether to bundle JS and assets in another build variant (if configured). * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants * // The configuration property can be in the following formats * // 'bundleIn${productFlavor}${buildType}' * // 'bundleIn${buildType}' * // bundleInFreeDebug: true, * // bundleInPaidRelease: true, * // bundleInBeta: true, * * // whether to disable dev mode in custom build variants (by default only disabled in release) * // for example: to disable dev mode in the staging build type (if configured) * devDisabledInStaging: true, * // The configuration property can be in the following formats * // 'devDisabledIn${productFlavor}${buildType}' * // 'devDisabledIn${buildType}' * * // the root of your project, i.e. where "package.json" lives * root: "../../", * * // where to put the JS bundle asset in debug mode * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", * * // where to put the JS bundle asset in release mode * jsBundleDirRelease: "$buildDir/intermediates/assets/release", * * // where to put drawable resources / React Native assets, e.g. the ones you use via * // require('./image.png')), in debug mode * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", * * // where to put drawable resources / React Native assets, e.g. the ones you use via * // require('./image.png')), in release mode * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", * * // by default the gradle tasks are skipped if none of the JS files or assets change; this means * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to * // date; if you have any other folders that you want to ignore for performance reasons (gradle * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ * // for example, you might want to remove it from here. * inputExcludes: ["android/**", "ios/**"], * * // override which node gets called and with what additional arguments * nodeExecutableAndArgs: ["node"], * * // supply additional arguments to the packager * extraPackagerArgs: [] * ] */ project.ext.react = [ entryFile: "index.js" ] apply from: "../../node_modules/react-native/react.gradle" /** * Set this to true to create two separate APKs instead of one: * - An APK that only works on ARM devices * - An APK that only works on x86 devices * The advantage is the size of the APK is reduced by about 4MB. * Upload all the APKs to the Play Store and people will download * the correct one based on the CPU architecture of their device. */ def enableSeparateBuildPerCPUArchitecture = false /** * Run Proguard to shrink the Java bytecode in release builds. */ def enableProguardInReleaseBuilds = false android { compileSdkVersion 25 buildToolsVersion "23.0.1" defaultConfig { applicationId "com.pickers" minSdkVersion 19 targetSdkVersion 25 versionCode 1 versionName "1.0" ndk { abiFilters "armeabi-v7a", "x86" } } splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK include "armeabi-v7a", "x86" } } buildTypes { release { minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } // applicationVariants are e.g. debug, release applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits def versionCodes = ["armeabi-v7a":1, "x86":2] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } } } dependencies { compile project(':react-native-svg') compile fileTree(dir: "libs", include: ["*.jar"]) compile "com.facebook.react:react-native:+" // From node_modules } // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { from configurations.compile into 'libs' } ================================================ FILE: example/android/app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Disabling obfuscation is useful if you collect stack traces from production crashes # (unless you are using a system that supports de-obfuscate the stack traces). -dontobfuscate # React Native # Keep our interfaces so they can be used by other ProGuard rules. # See http://sourceforge.net/p/proguard/bugs/466/ -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip # Do not strip any method/class that is annotated with @DoNotStrip -keep @com.facebook.proguard.annotations.DoNotStrip class * -keep @com.facebook.common.internal.DoNotStrip class * -keepclassmembers class * { @com.facebook.proguard.annotations.DoNotStrip *; @com.facebook.common.internal.DoNotStrip *; } -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { void set*(***); *** get*(); } -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } -keep class * extends com.facebook.react.bridge.NativeModule { *; } -keepclassmembers,includedescriptorclasses class * { native ; } -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } -dontwarn com.facebook.react.** # TextLayoutBuilder uses a non-public Android constructor within StaticLayout. # See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details. -dontwarn android.text.StaticLayout # okhttp -keepattributes Signature -keepattributes *Annotation* -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } -dontwarn okhttp3.** # okio -keep class sun.misc.Unsafe { *; } -dontwarn java.nio.file.* -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement -dontwarn okio.** ================================================ FILE: example/android/app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: example/android/app/src/main/java/com/pickers/MainActivity.java ================================================ package com.pickers; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.os.PersistableBundle; import android.util.Log; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.facebook.react.ReactActivity; public class MainActivity extends ReactActivity { @Override public void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // Translucent status bar Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.setStatusBarColor(Color.TRANSPARENT); } } super.onCreate(savedInstanceState); } /** * Returns the name of the main component registered from JavaScript. * This is used to schedule rendering of the component. */ @Override protected String getMainComponentName() { return "pickers"; } } ================================================ FILE: example/android/app/src/main/java/com/pickers/MainApplication.java ================================================ package com.pickers; import android.app.Application; import android.util.Log; import com.facebook.react.ReactApplication; import com.horcrux.svg.SvgPackage; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader; import java.util.Arrays; import java.util.List; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List getPackages() { return Arrays.asList( new MainReactPackage(), new SvgPackage() ); } @Override protected String getJSMainModuleName() { return "index"; } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); } } ================================================ FILE: example/android/app/src/main/res/values/strings.xml ================================================ pickers ================================================ FILE: example/android/app/src/main/res/values/styles.xml ================================================ ================================================ FILE: example/android/build.gradle ================================================ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { mavenLocal() jcenter() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } } } ================================================ FILE: example/android/gradle/wrapper/gradle-wrapper.properties ================================================ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip ================================================ FILE: example/android/gradle.properties ================================================ # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true android.useDeprecatedNdk=true ================================================ FILE: example/android/gradlew ================================================ #!/usr/bin/env bash ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS="" APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn ( ) { echo "$*" } die ( ) { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; esac # For Cygwin, ensure paths are in UNIX format before anything is touched. if $cygwin ; then [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` fi # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >&- APP_HOME="`pwd -P`" cd "$SAVED" >&- CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=$((i+1)) done case $i in (0) set -- ;; (1) set -- "$args0" ;; (2) set -- "$args0" "$args1" ;; (3) set -- "$args0" "$args1" "$args2" ;; (4) set -- "$args0" "$args1" "$args2" "$args3" ;; (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules function splitJvmOpts() { JVM_OPTS=("$@") } eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" ================================================ FILE: example/android/gradlew.bat ================================================ @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS= set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windowz variants if not "%OS%" == "Windows_NT" goto win9xME_args if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* goto execute :4NT_args @rem Get arguments from the 4NT Shell from JP Software set CMD_LINE_ARGS=%$ :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: example/android/keystores/BUCK ================================================ keystore( name = "debug", properties = "debug.keystore.properties", store = "debug.keystore", visibility = [ "PUBLIC", ], ) ================================================ FILE: example/android/keystores/debug.keystore.properties ================================================ key.store=debug.keystore key.alias=androiddebugkey key.store.password=android key.alias.password=android ================================================ FILE: example/android/settings.gradle ================================================ rootProject.name = 'pickers' include ':react-native-svg' project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') include ':app' ================================================ FILE: example/app.json ================================================ { "name": "pickers", "displayName": "pickers" } ================================================ FILE: example/index.js ================================================ import { AppRegistry } from 'react-native'; import MainPage from './src/MainPage'; AppRegistry.registerComponent('pickers', () => MainPage); ================================================ FILE: example/ios/pickers/AppDelegate.h ================================================ /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import @interface AppDelegate : UIResponder @property (nonatomic, strong) UIWindow *window; @end ================================================ FILE: example/ios/pickers/AppDelegate.m ================================================ /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import "AppDelegate.h" #import #import @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSURL *jsCodeLocation; jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"pickers" initialProperties:nil launchOptions:launchOptions]; rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [UIViewController new]; rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; return YES; } @end ================================================ FILE: example/ios/pickers/Base.lproj/LaunchScreen.xib ================================================ ================================================ FILE: example/ios/pickers/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "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" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: example/ios/pickers/Images.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: example/ios/pickers/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName pickers CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS NSAppTransportSecurity NSExceptionDomains localhost NSExceptionAllowsInsecureHTTPLoads NSLocationWhenInUseUsageDescription UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UIStatusBarStyle UIStatusBarStyleLightContent UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIViewControllerBasedStatusBarAppearance ================================================ FILE: example/ios/pickers/main.m ================================================ /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } ================================================ FILE: example/ios/pickers-tvOS/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance NSLocationWhenInUseUsageDescription NSAppTransportSecurity NSExceptionDomains localhost NSExceptionAllowsInsecureHTTPLoads ================================================ FILE: example/ios/pickers-tvOSTests/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 ================================================ FILE: example/ios/pickers.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 00E356F31AD99517003FC87E /* pickersTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* pickersTests.m */; }; 0C2E157B2D124BAD8C781BBF /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D94197A2D16B4D5CA5CC0CAE /* libRNSVG.a */; }; 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; 2DCD954D1E0B4F2C00145EB5 /* pickersTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* pickersTests.m */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTActionSheet; }; 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTGeolocation; }; 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = 58B5115D1A9E6B3D00147676; remoteInfo = RCTImage; }; 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; proxyType = 2; remoteGlobalIDString = 58B511DB1A9E6C8500147676; remoteInfo = RCTNetwork; }; 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; proxyType = 2; remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; remoteInfo = RCTVibration; }; 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; proxyType = 1; remoteGlobalIDString = 13B07F861A680F5B00A75B9A; remoteInfo = pickers; }; 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTSettings; }; 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3C86DF461ADF2C930047B81A; remoteInfo = RCTWebSocket; }; 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; remoteInfo = React; }; 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; proxyType = 1; remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; remoteInfo = "pickers-tvOS"; }; 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; proxyType = 2; remoteGlobalIDString = ADD01A681E09402E00F6D226; remoteInfo = "RCTBlob-tvOS"; }; 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; remoteInfo = fishhook; }; 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; remoteInfo = "fishhook-tvOS"; }; 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; remoteInfo = "RCTImage-tvOS"; }; 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A28471D9B043800D4039D; remoteInfo = "RCTLinking-tvOS"; }; 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A28541D9B044C00D4039D; remoteInfo = "RCTNetwork-tvOS"; }; 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A28611D9B046600D4039D; remoteInfo = "RCTSettings-tvOS"; }; 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A287B1D9B048500D4039D; remoteInfo = "RCTText-tvOS"; }; 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A28881D9B049200D4039D; remoteInfo = "RCTWebSocket-tvOS"; }; 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A28131D9B038B00D4039D; remoteInfo = "React-tvOS"; }; 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D3C059A1DE3340900C268FA; remoteInfo = yoga; }; 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D3C06751DE3340C00C268FA; remoteInfo = "yoga-tvOS"; }; 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; remoteInfo = cxxreact; }; 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; remoteInfo = "cxxreact-tvOS"; }; 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; remoteInfo = jschelpers; }; 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; remoteInfo = "jschelpers-tvOS"; }; 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTAnimation; }; 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; proxyType = 2; remoteGlobalIDString = 2D2A28201D9B03D100D4039D; remoteInfo = "RCTAnimation-tvOS"; }; 6E6E974C202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = EBF21BDC1FC498900052F4D5; remoteInfo = jsinspector; }; 6E6E974E202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5; remoteInfo = "jsinspector-tvOS"; }; 6E6E9750202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; remoteInfo = "third-party"; }; 6E6E9752202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; remoteInfo = "third-party-tvOS"; }; 6E6E9754202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 139D7E881E25C6D100323FB7; remoteInfo = "double-conversion"; }; 6E6E9756202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 3D383D621EBD27B9005632C8; remoteInfo = "double-conversion-tvOS"; }; 6E6E9758202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 9936F3131F5F2E4B0010BF04; remoteInfo = privatedata; }; 6E6E975A202B8793003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; proxyType = 2; remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04; remoteInfo = "privatedata-tvOS"; }; 6E6E9760202B8794003E6346 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 17592519A17B478C902658F0 /* RNSVG.xcodeproj */; proxyType = 2; remoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C; remoteInfo = RNSVG; }; 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTLinking; }; 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; proxyType = 2; remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; proxyType = 2; remoteGlobalIDString = 358F4ED71D1E81A9004DF814; remoteInfo = RCTBlob; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 00E356EE1AD99517003FC87E /* pickersTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = pickersTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* pickersTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = pickersTests.m; sourceTree = ""; }; 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* pickers.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = pickers.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = pickers/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = pickers/AppDelegate.m; sourceTree = ""; }; 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = pickers/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = pickers/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = pickers/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 17592519A17B478C902658F0 /* RNSVG.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNSVG.xcodeproj; path = "../node_modules/react-native-svg/ios/RNSVG.xcodeproj"; sourceTree = ""; }; 2D02E47B1E0B4A5D006451C7 /* pickers-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "pickers-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* pickers-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "pickers-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 71E34E02FE99464BAB4F98FD /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; D94197A2D16B4D5CA5CC0CAE /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 00E356EB1AD99517003FC87E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */, 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 0C2E157B2D124BAD8C781BBF /* libRNSVG.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */, 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 00C302A81ABCB8CE00DB3ED1 /* Products */ = { isa = PBXGroup; children = ( 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, ); name = Products; sourceTree = ""; }; 00C302B61ABCB90400DB3ED1 /* Products */ = { isa = PBXGroup; children = ( 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, ); name = Products; sourceTree = ""; }; 00C302BC1ABCB91800DB3ED1 /* Products */ = { isa = PBXGroup; children = ( 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, ); name = Products; sourceTree = ""; }; 00C302D41ABCB9D200DB3ED1 /* Products */ = { isa = PBXGroup; children = ( 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, ); name = Products; sourceTree = ""; }; 00C302E01ABCB9EE00DB3ED1 /* Products */ = { isa = PBXGroup; children = ( 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, ); name = Products; sourceTree = ""; }; 00E356EF1AD99517003FC87E /* pickersTests */ = { isa = PBXGroup; children = ( 00E356F21AD99517003FC87E /* pickersTests.m */, 00E356F01AD99517003FC87E /* Supporting Files */, ); path = pickersTests; sourceTree = ""; }; 00E356F01AD99517003FC87E /* Supporting Files */ = { isa = PBXGroup; children = ( 00E356F11AD99517003FC87E /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; }; 139105B71AF99BAD00B5F7CC /* Products */ = { isa = PBXGroup; children = ( 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, ); name = Products; sourceTree = ""; }; 139FDEE71B06529A00C62182 /* Products */ = { isa = PBXGroup; children = ( 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */, 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */, ); name = Products; sourceTree = ""; }; 13B07FAE1A68108700A75B9A /* pickers */ = { isa = PBXGroup; children = ( 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.m */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 13B07FB71A68108700A75B9A /* main.m */, ); name = pickers; sourceTree = ""; }; 146834001AC3E56700842450 /* Products */ = { isa = PBXGroup; children = ( 146834041AC3E56700842450 /* libReact.a */, 3DAD3EA31DF850E9000B6D8A /* libReact.a */, 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, 6E6E974D202B8793003E6346 /* libjsinspector.a */, 6E6E974F202B8793003E6346 /* libjsinspector-tvOS.a */, 6E6E9751202B8793003E6346 /* libthird-party.a */, 6E6E9753202B8793003E6346 /* libthird-party.a */, 6E6E9755202B8793003E6346 /* libdouble-conversion.a */, 6E6E9757202B8793003E6346 /* libdouble-conversion.a */, 6E6E9759202B8793003E6346 /* libprivatedata.a */, 6E6E975B202B8793003E6346 /* libprivatedata-tvOS.a */, ); name = Products; sourceTree = ""; }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( 2D16E6891FA4F8E400B85C8A /* libReact.a */, ); name = Frameworks; sourceTree = ""; }; 5E91572E1DD0AC6500FF2AA8 /* Products */ = { isa = PBXGroup; children = ( 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, ); name = Products; sourceTree = ""; }; 6E6E9726202B8791003E6346 /* Recovered References */ = { isa = PBXGroup; children = ( D94197A2D16B4D5CA5CC0CAE /* libRNSVG.a */, 71E34E02FE99464BAB4F98FD /* libRNSVG-tvOS.a */, ); name = "Recovered References"; sourceTree = ""; }; 6E6E975C202B8793003E6346 /* Products */ = { isa = PBXGroup; children = ( 6E6E9761202B8794003E6346 /* libRNSVG.a */, ); name = Products; sourceTree = ""; }; 78C398B11ACF4ADC00677621 /* Products */ = { isa = PBXGroup; children = ( 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, ); name = Products; sourceTree = ""; }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 146833FF1AC3E56700842450 /* React.xcodeproj */, 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 17592519A17B478C902658F0 /* RNSVG.xcodeproj */, ); name = Libraries; sourceTree = ""; }; 832341B11AAA6A8300B99B32 /* Products */ = { isa = PBXGroup; children = ( 832341B51AAA6A8300B99B32 /* libRCTText.a */, 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, ); name = Products; sourceTree = ""; }; 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( 13B07FAE1A68108700A75B9A /* pickers */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* pickersTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, 6E6E9726202B8791003E6346 /* Recovered References */, ); indentWidth = 2; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; children = ( 13B07F961A680F5B00A75B9A /* pickers.app */, 00E356EE1AD99517003FC87E /* pickersTests.xctest */, 2D02E47B1E0B4A5D006451C7 /* pickers-tvOS.app */, 2D02E4901E0B4A5D006451C7 /* pickers-tvOSTests.xctest */, ); name = Products; sourceTree = ""; }; ADBDB9201DFEBF0600ED6528 /* Products */ = { isa = PBXGroup; children = ( ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */, ); name = Products; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 00E356ED1AD99517003FC87E /* pickersTests */ = { isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "pickersTests" */; buildPhases = ( 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, ); buildRules = ( ); dependencies = ( 00E356F51AD99517003FC87E /* PBXTargetDependency */, ); name = pickersTests; productName = pickersTests; productReference = 00E356EE1AD99517003FC87E /* pickersTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 13B07F861A680F5B00A75B9A /* pickers */ = { isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "pickers" */; buildPhases = ( 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, ); buildRules = ( ); dependencies = ( ); name = pickers; productName = "Hello World"; productReference = 13B07F961A680F5B00A75B9A /* pickers.app */; productType = "com.apple.product-type.application"; }; 2D02E47A1E0B4A5D006451C7 /* pickers-tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "pickers-tvOS" */; buildPhases = ( 2D02E4771E0B4A5D006451C7 /* Sources */, 2D02E4781E0B4A5D006451C7 /* Frameworks */, 2D02E4791E0B4A5D006451C7 /* Resources */, 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, ); buildRules = ( ); dependencies = ( ); name = "pickers-tvOS"; productName = "pickers-tvOS"; productReference = 2D02E47B1E0B4A5D006451C7 /* pickers-tvOS.app */; productType = "com.apple.product-type.application"; }; 2D02E48F1E0B4A5D006451C7 /* pickers-tvOSTests */ = { isa = PBXNativeTarget; buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "pickers-tvOSTests" */; buildPhases = ( 2D02E48C1E0B4A5D006451C7 /* Sources */, 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 2D02E48E1E0B4A5D006451C7 /* Resources */, ); buildRules = ( ); dependencies = ( 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, ); name = "pickers-tvOSTests"; productName = "pickers-tvOSTests"; productReference = 2D02E4901E0B4A5D006451C7 /* pickers-tvOSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 610; ORGANIZATIONNAME = Facebook; TargetAttributes = { 00E356ED1AD99517003FC87E = { CreatedOnToolsVersion = 6.2; TestTargetID = 13B07F861A680F5B00A75B9A; }; 13B07F861A680F5B00A75B9A = { DevelopmentTeam = Q9W5LFLCU2; }; 2D02E47A1E0B4A5D006451C7 = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; }; 2D02E48F1E0B4A5D006451C7 = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; TestTargetID = 2D02E47A1E0B4A5D006451C7; }; }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "pickers" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; projectReferences = ( { ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; }, { ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; }, { ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; }, { ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; }, { ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; }, { ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; }, { ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; }, { ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; }, { ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; }, { ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; }, { ProductGroup = 139FDEE71B06529A00C62182 /* Products */; ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; }, { ProductGroup = 146834001AC3E56700842450 /* Products */; ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; }, { ProductGroup = 6E6E975C202B8793003E6346 /* Products */; ProjectRef = 17592519A17B478C902658F0 /* RNSVG.xcodeproj */; }, ); projectRoot = ""; targets = ( 13B07F861A680F5B00A75B9A /* pickers */, 00E356ED1AD99517003FC87E /* pickersTests */, 2D02E47A1E0B4A5D006451C7 /* pickers-tvOS */, 2D02E48F1E0B4A5D006451C7 /* pickers-tvOSTests */, ); }; /* End PBXProject section */ /* Begin PBXReferenceProxy section */ 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTActionSheet.a; remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTGeolocation.a; remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTImage.a; remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTNetwork.a; remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTVibration.a; remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTSettings.a; remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTWebSocket.a; remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 146834041AC3E56700842450 /* libReact.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libReact.a; remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTBlob-tvOS.a"; remoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libfishhook.a; remoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libfishhook-tvOS.a"; remoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTImage-tvOS.a"; remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTLinking-tvOS.a"; remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTNetwork-tvOS.a"; remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTSettings-tvOS.a"; remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTText-tvOS.a"; remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libRCTWebSocket-tvOS.a"; remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libReact.a; remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libyoga.a; remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libyoga.a; remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libcxxreact.a; remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libcxxreact.a; remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libjschelpers.a; remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libjschelpers.a; remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTAnimation.a; remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTAnimation.a; remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E974D202B8793003E6346 /* libjsinspector.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libjsinspector.a; remoteRef = 6E6E974C202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E974F202B8793003E6346 /* libjsinspector-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libjsinspector-tvOS.a"; remoteRef = 6E6E974E202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E9751202B8793003E6346 /* libthird-party.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libthird-party.a"; remoteRef = 6E6E9750202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E9753202B8793003E6346 /* libthird-party.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libthird-party.a"; remoteRef = 6E6E9752202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E9755202B8793003E6346 /* libdouble-conversion.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libdouble-conversion.a"; remoteRef = 6E6E9754202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E9757202B8793003E6346 /* libdouble-conversion.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libdouble-conversion.a"; remoteRef = 6E6E9756202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E9759202B8793003E6346 /* libprivatedata.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libprivatedata.a; remoteRef = 6E6E9758202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E975B202B8793003E6346 /* libprivatedata-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libprivatedata-tvOS.a"; remoteRef = 6E6E975A202B8793003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 6E6E9761202B8794003E6346 /* libRNSVG.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRNSVG.a; remoteRef = 6E6E9760202B8794003E6346 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTLinking.a; remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTText.a; remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libRCTBlob.a; remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ 00E356EC1AD99517003FC87E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 13B07F8E1A680F5B00A75B9A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E4791E0B4A5D006451C7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E48E1E0B4A5D006451C7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Bundle React Native code and images"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Bundle React Native Code And Images"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 00E356EA1AD99517003FC87E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 00E356F31AD99517003FC87E /* pickersTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 13B07F871A680F5B00A75B9A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E4771E0B4A5D006451C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E48C1E0B4A5D006451C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2DCD954D1E0B4F2C00145EB5 /* pickersTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 13B07F861A680F5B00A75B9A /* pickers */; targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; }; 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2D02E47A1E0B4A5D006451C7 /* pickers-tvOS */; targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { isa = PBXVariantGroup; children = ( 13B07FB21A68108700A75B9A /* Base */, ); name = LaunchScreen.xib; path = pickers; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", ); INFOPLIST_FILE = pickersTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pickers.app/pickers"; }; name = Debug; }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", ); INFOPLIST_FILE = pickersTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pickers.app/pickers"; }; name = Release; }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = Q9W5LFLCU2; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", ); INFOPLIST_FILE = pickers/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = com.iBroker.pickers; PRODUCT_NAME = pickers; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = Q9W5LFLCU2; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", ); INFOPLIST_FILE = pickers/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = com.iBroker.pickers; PRODUCT_NAME = pickers; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; 2D02E4971E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", ); INFOPLIST_FILE = "pickers-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.pickers-tvOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; }; name = Debug; }; 2D02E4981E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_NO_COMMON_BLOCKS = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", ); INFOPLIST_FILE = "pickers-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.pickers-tvOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; }; name = Release; }; 2D02E4991E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "pickers-tvOSTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.pickers-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pickers-tvOS.app/pickers-tvOS"; TVOS_DEPLOYMENT_TARGET = 10.1; }; name = Debug; }; 2D02E49A1E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "pickers-tvOSTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.pickers-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pickers-tvOS.app/pickers-tvOS"; TVOS_DEPLOYMENT_TARGET = 10.1; }; name = Release; }; 83CBBA201A601CBA00E9B192 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 83CBBA211A601CBA00E9B192 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "pickersTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 00E356F61AD99517003FC87E /* Debug */, 00E356F71AD99517003FC87E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "pickers" */ = { isa = XCConfigurationList; buildConfigurations = ( 13B07F941A680F5B00A75B9A /* Debug */, 13B07F951A680F5B00A75B9A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "pickers-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( 2D02E4971E0B4A5E006451C7 /* Debug */, 2D02E4981E0B4A5E006451C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "pickers-tvOSTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 2D02E4991E0B4A5E006451C7 /* Debug */, 2D02E49A1E0B4A5E006451C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "pickers" */ = { isa = XCConfigurationList; buildConfigurations = ( 83CBBA201A601CBA00E9B192 /* Debug */, 83CBBA211A601CBA00E9B192 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; } ================================================ FILE: example/ios/pickers.xcodeproj/xcshareddata/xcschemes/pickers-tvOS.xcscheme ================================================ ================================================ FILE: example/ios/pickers.xcodeproj/xcshareddata/xcschemes/pickers.xcscheme ================================================ ================================================ FILE: example/ios/pickersTests/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 ================================================ FILE: example/ios/pickersTests/pickersTests.m ================================================ /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import #import #import #import #define TIMEOUT_SECONDS 600 #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" @interface pickersTests : XCTestCase @end @implementation pickersTests - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test { if (test(view)) { return YES; } for (UIView *subview in [view subviews]) { if ([self findSubviewInView:subview matching:test]) { return YES; } } return NO; } - (void)testRendersWelcomeScreen { UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; BOOL foundElement = NO; __block NSString *redboxError = nil; RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { if (level >= RCTLogLevelError) { redboxError = message; } }); while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { return YES; } return NO; }]; } RCTSetLogFunction(RCTDefaultLogFunction); XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); } @end ================================================ FILE: example/package.json ================================================ { "name": "pickers", "version": "0.0.1", "private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start", "test": "jest" }, "dependencies": { "react": "^16.3.0-alpha.1", "react-native": "0.53.3", "react-native-pickers": "^1.1.9", "react-native-svg": "^6.2.2" }, "devDependencies": { "babel-jest": "22.2.0", "babel-preset-react-native": "4.0.0", "jest": "22.2.1", "react-test-renderer": "16.2.0" }, "jest": { "preset": "react-native" } } ================================================ FILE: example/src/Area.json ================================================ [ { "name": "香港", "city": [ { "name": "香港", "area": [ "中西區", "灣仔區", "東區", "南區", "深水埗區", "油尖旺區", "油麻地", "尖沙咀", "旺角", "九龍城區", "黃大仙區", "觀塘區", "北區", "大埔區", "沙田區", "西貢區", "元朗區", "屯門區", "荃灣區", "葵青區", "離島區", "其他" ] } ] }, { "name": "台灣", "city": [ { "name": "台灣", "area": [ "臺北市", "高雄市", "臺北縣", "桃園縣", "新竹縣", "苗栗縣", "臺中縣", "彰化縣", "南投縣", "雲林縣", "嘉義縣", "臺南縣", "高雄縣", "屏東縣", "宜蘭縣", "花蓮縣", "臺東縣", "澎湖縣", "基隆市", "新竹市", "臺中市", "嘉義市", "臺南市", "其他" ] } ] }, { "name": "澳門", "city": [ { "name": "澳門", "area": [ "花地瑪堂區", "聖安多尼堂區", "大堂區", "望德堂區", "風順堂區", "嘉模堂區", "聖方濟各堂區", "路氹", "其他" ] } ] }, { "name": "北京", "city": [ { "name": "北京", "area": [ "東城區", "西城區", "崇文區", "宣武區", "朝陽區", "豐臺區", "石景山區", "海澱區", "門頭溝區", "房山區", "通州區", "順義區", "昌平區", "大興區", "平谷區", "懷柔區", "密雲縣", "延慶縣", "其他" ] } ] }, { "name": "天津", "city": [ { "name": "天津", "area": [ "和平區", "河東區", "河西區", "南開區", "河北區", "紅橋區", "塘沽區", "漢沽區", "大港區", "東麗區", "西青區", "津南區", "北辰區", "武清區", "寶坻區", "寧河縣", "靜海縣", "薊縣", "其他" ] } ] }, { "name": "河北", "city": [ { "name": "石家莊", "area": [ "長安區", "橋東區", "橋西區", "新華區", "郊區", "井陘礦區", "井陘縣", "正定縣", "欒城縣", "行唐縣", "靈壽縣", "高邑縣", "深澤縣", "贊皇縣", "無極縣", "平山縣", "元氏縣", "趙縣", "辛集市", "槁", "晉州市", "新樂市", "鹿泉市", "其他" ] }, { "name": "唐山", "area": [ "路南區", "路北區", "古冶區", "開平區", "新區", "豐潤縣", "灤縣", "灤南縣", "樂亭縣", "遷西縣", "玉田縣", "唐海縣", "遵化市", "豐南市", "遷安市", "其他" ] }, { "name": "秦皇島", "area": [ "海港區", "山海關區", "北戴河區", "青龍滿族自治縣", "昌黎縣", "撫寧縣", "盧龍縣", "其他" ] }, { "name": "邯鄲", "area": [ "邯山區", "叢臺區", "復興區", "峰峰礦區", "邯鄲縣", "臨漳縣", "成安縣", "大名縣", "涉縣", "磁縣", "肥鄉縣", "永年縣", "邱縣", "雞澤縣", "廣平縣", "館陶縣", "魏縣", "曲周縣", "武安市", "其他" ] }, { "name": "邢臺", "area": [ "橋東區", "橋西區", "邢臺縣", "臨城縣", "內丘縣", "柏鄉縣", "隆堯縣", "任縣", "南和縣", "寧晉縣", "巨鹿縣", "新河縣", "廣宗縣", "平鄉縣", "威縣", "清河縣", "臨西縣", "南宮市", "沙河市", "其他" ] }, { "name": "保定", "area": [ "新市區", "北市區", "南市區", "滿城縣", "清苑縣", "淶水縣", "阜平縣", "徐水縣", "定興縣", "唐縣", "高陽縣", "容城縣", "淶源縣", "望都縣", "安新縣", "易縣", "曲陽縣", "蠡縣", "順平縣", "博野", "雄縣", "涿州市", "定州市", "安國市", "高碑店市", "其他" ] }, { "name": "張家口", "area": [ "橋東區", "橋西區", "宣化區", "下花園區", "宣化縣", "張北縣", "康保縣", "沽源縣", "尚義縣", "蔚縣", "陽原縣", "懷安縣", "萬全縣", "懷來縣", "涿鹿縣", "赤城縣", "崇禮縣", "其他" ] }, { "name": "承德", "area": [ "雙橋區", "雙灤區", "鷹手營子礦區", "承德縣", "興隆縣", "平泉縣", "灤平縣", "隆化縣", "豐寧滿族自治縣", "寬城滿族自治縣", "圍場滿族蒙古族自治縣", "其他" ] }, { "name": "滄州", "area": [ "新華區", "運河區", "滄縣", "青縣", "東光縣", "海興縣", "鹽山縣", "肅寧縣", "南皮縣", "吳橋縣", "獻縣", "孟村回族自治縣", "泊頭市", "任丘市", "黃驊市", "河間市", "其他" ] }, { "name": "廊坊", "area": [ "安次區", "固安縣", "永清縣", "香河縣", "大城縣", "文安縣", "大廠回族自治縣", "霸州市", "三河市", "其他" ] }, { "name": "衡水", "area": [ "桃城區", "棗強縣", "武邑縣", "武強縣", "饒陽縣", "安平縣", "故城縣", "景縣", "阜城縣", "冀州市", "深州市", "其他" ] } ] }, { "name": "山西", "city": [ { "name": "太原", "area": [ "小店區", "迎澤區", "杏花嶺區", "尖草坪區", "萬柏林區", "晉源區", "清徐縣", "陽曲縣", "婁煩縣", "古交市", "其他" ] }, { "name": "大同", "area": [ "城區", "礦區", "南郊區", "新榮區", "陽高縣", "天鎮縣", "廣靈縣", "靈丘縣", "渾源縣", "左雲縣", "大同縣", "其他" ] }, { "name": "陽泉", "area": [ "城區", "礦區", "郊區", "平定縣", "盂縣", "其他" ] }, { "name": "長治", "area": [ "城區", "郊區", "長治縣", "襄垣縣", "屯留縣", "平順縣", "黎城縣", "壺關縣", "長子縣", "武鄉縣", "沁縣", "沁源縣", "潞城市", "其他" ] }, { "name": "晉城", "area": [ "城區", "沁水縣", "陽城縣", "陵川縣", "澤州縣", "高平市", "其他" ] }, { "name": "朔州", "area": [ "朔城區", "平魯區", "山陰縣", "應縣", "右玉縣", "懷仁縣", "其他" ] }, { "name": "忻州", "area": [ "忻府區", "原平市", "定襄縣", "五臺縣", "代縣", "繁峙縣", "寧武縣", "靜樂縣", "神池縣", "五寨縣", "苛嵐縣", "河曲縣", "保德縣", "偏關縣", "其他" ] }, { "name": "呂梁", "area": [ "離石區", "孝義市", "汾陽市", "文水縣", "交城縣", "興縣", "臨縣", "柳林縣", "石樓縣", "嵐縣", "方山縣", "中陽縣", "交口縣", "其他" ] }, { "name": "晉中", "area": [ "榆次市", "介休市", "榆社縣", "左權縣", "和順縣", "昔陽縣", "壽陽縣", "太谷縣", "祁縣", "平遙縣", "靈石縣", "其他" ] }, { "name": "臨汾", "area": [ "臨汾市", "侯馬市", "霍州市", "曲沃縣", "翼城縣", "襄汾縣", "洪洞縣", "古縣", "安澤縣", "浮山縣", "吉縣", "鄉寧縣", "蒲縣", "大寧縣", "永和縣", "隰縣", "汾西縣", "其他" ] }, { "name": "運城", "area": [ "運城市", "永濟市", "河津市", "芮城縣", "臨猗縣", "萬榮縣", "新絳縣", "稷山縣", "聞喜縣", "夏縣", "絳縣", "平陸縣", "垣曲縣", "其他" ] } ] }, { "name": "內蒙古", "city": [ { "name": "呼和浩特", "area": [ "新城區", "回民區", "玉泉區", "郊區", "土默特左旗", "托克托縣", "和林格爾縣", "清水河縣", "武川縣", "其他" ] }, { "name": "包頭", "area": [ "東河區", "昆都倫區", "青山區", "石拐礦區", "白雲礦區", "郊區", "土默特右旗", "固陽縣", "達爾罕茂明安聯合旗", "其他" ] }, { "name": "烏海", "area": [ "海勃灣區", "海南區", "烏達區", "其他" ] }, { "name": "赤峰", "area": [ "紅山區", "元寶山區", "松山區", "阿魯科爾沁旗", "巴林左旗", "巴林右旗", "林西縣", "克什克騰旗", "翁牛特旗", "喀喇沁旗", "寧城縣", "敖漢旗", "其他" ] }, { "name": "呼倫貝爾", "area": [ "海拉爾市", "滿洲裏市", "紮蘭屯市", "牙克石市", "根河市", "額爾古納市", "阿榮旗", "莫力達瓦達斡爾族自治旗", "鄂倫春自治旗", "鄂溫克族自治旗", "新巴爾虎右旗", "新巴爾虎左旗", "陳巴爾虎旗", "其他" ] }, { "name": "興安盟", "area": [ "烏蘭浩特市", "阿爾山市", "科爾沁右翼前旗", "科爾沁右翼中旗", "紮賚特旗", "突泉縣", "其他" ] }, { "name": "通遼", "area": [ "科爾沁區", "霍林郭勒市", "科爾沁左翼中旗", "科爾沁左翼後旗", "開魯縣", "庫倫旗", "奈曼旗", "紮魯特旗", "其他" ] }, { "name": "錫林郭勒盟", "area": [ "二連浩特市", "錫林浩特市", "阿巴嘎旗", "蘇尼特左旗", "蘇尼特右旗", "東烏珠穆沁旗", "西烏珠穆沁旗", "太仆寺旗", "鑲黃旗", "正鑲白旗", "正藍旗", "多倫縣", "其他" ] }, { "name": "烏蘭察布盟", "area": [ "集寧市", "豐鎮市", "卓資縣", "化德縣", "商都縣", "興和縣", "涼城縣", "察哈爾右翼前旗", "察哈爾右翼中旗", "察哈爾右翼後旗", "四子王旗", "其他" ] }, { "name": "伊克昭盟", "area": [ "東勝市", "達拉特旗", "準格爾旗", "鄂托克前旗", "鄂托克旗", "杭錦旗", "烏審旗", "伊金霍洛旗", "其他" ] }, { "name": "巴彥淖爾盟", "area": [ "臨河市", "五原縣", "磴口縣", "烏拉特前旗", "烏拉特中旗", "烏拉特後旗", "杭錦後旗", "其他" ] }, { "name": "阿拉善盟", "area": [ "阿拉善左旗", "阿拉善右旗", "額濟納旗", "其他" ] } ] }, { "name": "遼寧", "city": [ { "name": "沈陽", "area": [ "沈河區", "皇姑區", "和平區", "大東區", "鐵西區", "蘇家屯區", "東陵區", "於洪區", "新民市", "法庫縣", "遼中縣", "康平縣", "新城子區", "其他" ] }, { "name": "大連", "area": [ "西崗區", "中山區", "沙河口區", "甘井子區", "旅順口區", "金州區", "瓦房店市", "普蘭店市", "莊河市", "長海縣", "其他" ] }, { "name": "鞍山", "area": [ "鐵東區", "鐵西區", "立山區", "千山區", "海城市", "臺安縣", "岫巖滿族自治縣", "其他" ] }, { "name": "撫順", "area": [ "順城區", "新撫區", "東洲區", "望花區", "撫順縣", "清原滿族自治縣", "新賓滿族自治縣", "其他" ] }, { "name": "本溪", "area": [ "平山區", "明山區", "溪湖區", "南芬區", "本溪滿族自治縣", "桓仁滿族自治縣", "其他" ] }, { "name": "丹東", "area": [ "振興區", "元寶區", "振安區", "東港市", "鳳城市", "寬甸滿族自治縣", "其他" ] }, { "name": "錦州", "area": [ "太和區", "古塔區", "淩河區", "淩海市", "黑山縣", "義縣", "北寧市", "其他" ] }, { "name": "營口", "area": [ "站前區", "西市區", "鮁魚圈區", "老邊區", "大石橋市", "蓋州市", "其他" ] }, { "name": "阜新", "area": [ "海州區", "新邱區", "太平區", "清河門區", "細河區", "彰武縣", "阜新蒙古族自治縣", "其他" ] }, { "name": "遼陽", "area": [ "白塔區", "文聖區", "宏偉區", "太子河區", "弓長嶺區", "燈塔市", "遼陽縣", "其他" ] }, { "name": "盤錦", "area": [ "雙臺子區", "興隆臺區", "盤山縣", "大窪縣", "其他" ] }, { "name": "鐵嶺", "area": [ "銀州區", "清河區", "調兵山市", "開原市", "鐵嶺縣", "昌圖縣", "西豐縣", "其他" ] }, { "name": "朝陽", "area": [ "雙塔區", "龍城區", "淩源市", "北票市", "朝陽縣", "建平縣", "喀喇沁左翼蒙古族自治縣", "其他" ] }, { "name": "葫蘆島", "area": [ "龍港區", "南票區", "連山區", "興城市", "綏中縣", "建昌縣", "其他" ] } ] }, { "name": "吉林", "city": [ { "name": "長春", "area": [ "朝陽區", "寬城區", "二道區", "南關區", "綠園區", "雙陽區", "九臺市", "榆樹市", "德惠市", "農安縣", "其他" ] }, { "name": "吉林", "area": [ "船營區", "昌邑區", "龍潭區", "豐滿區", "舒蘭市", "樺甸市", "蛟河市", "磐石市", "永吉縣", "其他" ] }, { "name": "四平", "area": [ "鐵西區", "鐵東區", "公主嶺市", "雙遼市", "梨樹縣", "伊通滿族自治縣", "其他" ] }, { "name": "遼源", "area": [ "龍山區", "西安區", "東遼縣", "東豐縣", "其他" ] }, { "name": "通化", "area": [ "東昌區", "二道江區", "梅河口市", "集安市", "通化縣", "輝南縣", "柳河縣", "其他" ] }, { "name": "白山", "area": [ "八道江區", "江源區", "臨江市", "靖宇縣", "撫松縣", "長白朝鮮族自治縣", "其他" ] }, { "name": "松原", "area": [ "寧江區", "乾安縣", "長嶺縣", "扶余縣", "前郭爾羅斯蒙古族自治縣", "其他" ] }, { "name": "白城", "area": [ "桃北區", "大安市", "桃南市", "鎮賚縣", "通榆縣", "其他" ] }, { "name": "延邊朝鮮族自治州", "area": [ "延吉市", "圖們市", "敦化市", "龍井市", "琿春市", "和龍市", "安圖縣", "汪清縣", "其他" ] } ] }, { "name": "黑龍江", "city": [ { "name": "哈爾濱", "area": [ "松北區", "道裏區", "南崗區", "平房區", "香坊區", "道外區", "呼蘭區", "阿城區", "雙城市", "尚誌市", "五常市", "賓縣", "方正縣", "通河縣", "巴彥縣", "延壽縣", "木蘭縣", "依蘭縣", "其他" ] }, { "name": "齊齊哈爾", "area": [ "龍沙區", "昂昂溪區", "鐵鋒區", "建華區", "富拉爾基區", "碾子山區", "梅裏斯達斡爾族區", "訥河市", "富裕縣", "拜泉縣", "甘南縣", "依安縣", "克山縣", "泰來縣", "克東縣", "龍江縣", "其他" ] }, { "name": "鶴崗", "area": [ "興山區", "工農區", "南山區", "興安區", "向陽區", "東山區", "蘿北縣", "綏濱縣", "其他" ] }, { "name": "雙鴨山", "area": [ "尖山區", "嶺東區", "四方臺區", "寶山區", "集賢縣", "寶清縣", "友誼縣", "饒河縣", "其他" ] }, { "name": "雞西", "area": [ "雞冠區", "恒山區", "城子河區", "滴道區", "梨樹區", "麻山區", "密山市", "虎林市", "雞東縣", "其他" ] }, { "name": "大慶", "area": [ "薩爾圖區", "紅崗區", "龍鳳區", "讓胡路區", "大同區", "林甸縣", "肇州縣", "肇源縣", "杜爾伯特蒙古族自治縣", "其他" ] }, { "name": "伊春", "area": [ "伊春區", "帶嶺區", "南岔區", "金山屯區", "西林區", "美溪區", "烏馬河區", "翠巒區", "友好區", "上甘嶺區", "五營區", "紅星區", "新青區", "湯旺河區", "烏伊嶺區", "鐵力市", "嘉蔭縣", "其他" ] }, { "name": "牡丹江", "area": [ "愛民區", "東安區", "陽明區", "西安區", "綏芬河市", "寧安市", "海林市", "穆棱市", "林口縣", "東寧縣", "其他" ] }, { "name": "佳木斯", "area": [ "向陽區", "前進區", "東風區", "郊區", "同江市", "富錦市", "樺川縣", "撫遠縣", "樺南縣", "湯原縣", "其他" ] }, { "name": "七臺河", "area": [ "桃山區", "新興區", "茄子河區", "勃利縣", "其他" ] }, { "name": "黑河", "area": [ "愛輝區", "北安市", "五大連池市", "遜克縣", "嫩江縣", "孫吳縣", "其他" ] }, { "name": "綏化", "area": [ "北林區", "安達市", "肇東市", "海倫市", "綏棱縣", "蘭西縣", "明水縣", "青岡縣", "慶安縣", "望奎縣", "其他" ] }, { "name": "大興安嶺地區", "area": [ "呼瑪縣", "塔河縣", "漠河縣", "大興安嶺轄區", "其他" ] } ] }, { "name": "上海", "city": [ { "name": "上海", "area": [ "黃浦區", "盧灣區", "徐匯區", "長寧區", "靜安區", "普陀區", "閘北區", "虹口區", "楊浦區", "寶山區", "閔行區", "嘉定區", "松江區", "金山區", "青浦區", "南匯區", "奉賢區", "浦東新區", "崇明縣", "其他" ] } ] }, { "name": "江蘇", "city": [ { "name": "南京", "area": [ "玄武區", "白下區", "秦淮區", "建鄴區", "鼓樓區", "下關區", "棲霞區", "雨花臺區", "浦口區", "江寧區", "六合區", "溧水縣", "高淳縣", "其他" ] }, { "name": "蘇州", "area": [ "金閶區", "平江區", "滄浪區", "虎丘區", "吳中區", "相城區", "常熟市", "張家港市", "昆山市", "吳江市", "太倉市", "其他" ] }, { "name": "無錫", "area": [ "崇安區", "南長區", "北塘區", "濱湖區", "錫山區", "惠山區", "江陰市", "宜興市", "其他" ] }, { "name": "常州", "area": [ "鐘樓區", "天寧區", "戚墅堰區", "新北區", "武進區", "金壇市", "溧陽市", "其他" ] }, { "name": "鎮江", "area": [ "京口區", "潤州區", "丹徒區", "丹陽市", "揚中市", "句容市", "其他" ] }, { "name": "南通", "area": [ "崇川區", "港閘區", "通州市", "如臯市", "海門市", "啟東市", "海安縣", "如東縣", "其他" ] }, { "name": "泰州", "area": [ "海陵區", "高港區", "姜堰市", "泰興市", "靖江市", "興化市", "其他" ] }, { "name": "揚州", "area": [ "廣陵區", "維揚區", "邗江區", "江都市", "儀征市", "高郵市", "寶應縣", "其他" ] }, { "name": "鹽城", "area": [ "亭湖區", "鹽都區", "大豐市", "東臺市", "建湖縣", "射陽縣", "阜寧縣", "濱海縣", "響水縣", "其他" ] }, { "name": "連雲港", "area": [ "新浦區", "海州區", "連雲區", "東海縣", "灌雲縣", "贛榆縣", "灌南縣", "其他" ] }, { "name": "徐州", "area": [ "雲龍區", "鼓樓區", "九裏區", "泉山區", "賈汪區", "邳州市", "新沂市", "銅山縣", "睢寧縣", "沛縣", "豐縣", "其他" ] }, { "name": "淮安", "area": [ "清河區", "清浦區", "楚州區", "淮陰區", "漣水縣", "洪澤縣", "金湖縣", "盱眙縣", "其他" ] }, { "name": "宿遷", "area": [ "宿城區", "宿豫區", "述陽縣", "泗陽縣", "泗洪縣", "其他" ] } ] }, { "name": "浙江", "city": [ { "name": "杭州", "area": [ "拱墅區", "西湖區", "上城區", "下城區", "江幹區", "濱江區", "余杭區", "蕭山區", "建德市", "富陽市", "臨安市", "桐廬縣", "淳安縣", "其他" ] }, { "name": "寧波", "area": [ "海曙區", "江東區", "江北區", "鎮海區", "北侖區", "鄞州區", "余姚市", "慈溪市", "奉化市", "寧海縣", "象山縣", "其他" ] }, { "name": "溫州", "area": [ "鹿城區", "龍灣區", "甌海區", "瑞安市", "樂清市", "永嘉縣", "洞頭縣", "平陽縣", "蒼南縣", "文成縣", "泰順縣", "其他" ] }, { "name": "嘉興", "area": [ "秀城區", "秀洲區", "海寧市", "平湖市", "桐鄉市", "嘉善縣", "海鹽縣", "其他" ] }, { "name": "湖州", "area": [ "吳興區", "南潯區", "長興縣", "德清縣", "安吉縣", "其他" ] }, { "name": "紹興", "area": [ "越城區", "諸暨市", "上虞市", "嵊州市", "紹興縣", "新昌縣", "其他" ] }, { "name": "金華", "area": [ "婺城區", "金東區", "蘭溪市", "義烏市", "東陽市", "永康市", "武義縣", "浦江縣", "磐安縣", "其他" ] }, { "name": "衢州", "area": [ "柯城區", "衢江區", "江山市", "龍遊縣", "常山縣", "開化縣", "其他" ] }, { "name": "舟山", "area": [ "定海區", "普陀區", "岱山縣", "嵊泗縣", "其他" ] }, { "name": "臺州", "area": [ "椒江區", "黃巖區", "路橋區", "臨海市", "溫嶺市", "玉環縣", "天臺縣", "仙居縣", "三門縣", "其他" ] }, { "name": "麗水", "area": [ "蓮都區", "龍泉市", "縉雲縣", "青田縣", "雲和縣", "遂昌縣", "松陽縣", "慶元縣", "景寧畬族自治縣", "其他" ] } ] }, { "name": "安徽", "city": [ { "name": "合肥", "area": [ "廬陽區", "瑤海區", "蜀山區", "包河區", "長豐縣", "肥東縣", "肥西縣", "其他" ] }, { "name": "蕪湖", "area": [ "鏡湖區", "弋江區", "鳩江區", "三山區", "蕪湖縣", "南陵縣", "繁昌縣", "其他" ] }, { "name": "蚌埠", "area": [ "蚌山區", "龍子湖區", "禹會區", "淮上區", "懷遠縣", "固鎮縣", "五河縣", "其他" ] }, { "name": "淮南", "area": [ "田家庵區", "大通區", "謝家集區", "八公山區", "潘集區", "鳳臺縣", "其他" ] }, { "name": "馬鞍山", "area": [ "雨山區", "花山區", "金家莊區", "當塗縣", "其他" ] }, { "name": "淮北", "area": [ "相山區", "杜集區", "烈山區", "濉溪縣", "其他" ] }, { "name": "銅陵", "area": [ "銅官山區", "獅子山區", "郊區", "銅陵縣", "其他" ] }, { "name": "安慶", "area": [ "迎江區", "大觀區", "宜秀區", "桐城市", "宿松縣", "樅陽縣", "太湖縣", "懷寧縣", "嶽西縣", "望江縣", "潛山縣", "其他" ] }, { "name": "黃山", "area": [ "屯溪區", "黃山區", "徽州區", "休寧縣", "歙縣", "祁門縣", "黟縣", "其他" ] }, { "name": "滁州", "area": [ "瑯琊區", "南譙區", "天長市", "明光市", "全椒縣", "來安縣", "定遠縣", "鳳陽縣", "其他" ] }, { "name": "阜陽", "area": [ "潁州區", "潁東區", "潁泉區", "界首市", "臨泉縣", "潁上縣", "阜南縣", "太和縣", "其他" ] }, { "name": "宿州", "area": [ "埇橋區", "蕭縣", "泗縣", "碭山縣", "靈璧縣", "其他" ] }, { "name": "巢湖", "area": [ "居巢區", "含山縣", "無為縣", "廬江縣", "和縣", "其他" ] }, { "name": "六安", "area": [ "金安區", "裕安區", "壽縣", "霍山縣", "霍邱縣", "舒城縣", "金寨縣", "其他" ] }, { "name": "亳州", "area": [ "譙城區", "利辛縣", "渦陽縣", "蒙城縣", "其他" ] }, { "name": "池州", "area": [ "貴池區", "東至縣", "石臺縣", "青陽縣", "其他" ] }, { "name": "宣城", "area": [ "宣州區", "寧國市", "廣德縣", "郎溪縣", "涇縣", "旌德縣", "績溪縣", "其他" ] } ] }, { "name": "福建", "city": [ { "name": "福州", "area": [ "鼓樓區", "臺江區", "倉山區", "馬尾區", "晉安區", "福清市", "長樂市", "閩侯縣", "閩清縣", "永泰縣", "連江縣", "羅源縣", "平潭縣", "其他" ] }, { "name": "廈門", "area": [ "思明區", "海滄區", "湖裏區", "集美區", "同安區", "翔安區", "其他" ] }, { "name": "莆田", "area": [ "城廂區", "涵江區", "荔城區", "秀嶼區", "仙遊縣", "其他" ] }, { "name": "三明", "area": [ "梅列區", "三元區", "永安市", "明溪縣", "將樂縣", "大田縣", "寧化縣", "建寧縣", "沙縣", "尤溪縣", "清流縣", "泰寧縣", "其他" ] }, { "name": "泉州", "area": [ "鯉城區", "豐澤區", "洛江區", "泉港區", "石獅市", "晉江市", "南安市", "惠安縣", "永春縣", "安溪縣", "德化縣", "金門縣", "其他" ] }, { "name": "漳州", "area": [ "薌城區", "龍文區", "龍海市", "平和縣", "南靖縣", "詔安縣", "漳浦縣", "華安縣", "東山縣", "長泰縣", "雲霄縣", "其他" ] }, { "name": "南平", "area": [ "延平區", "建甌市", "邵武市", "武夷山市", "建陽市", "松溪縣", "光澤縣", "順昌縣", "浦城縣", "政和縣", "其他" ] }, { "name": "龍岩", "area": [ "新羅區", "漳平市", "長汀縣", "武平縣", "上杭縣", "永定縣", "連城縣", "其他" ] }, { "name": "寧德", "area": [ "蕉城區", "福安市", "福鼎市", "壽寧縣", "霞浦縣", "柘榮縣", "屏南縣", "古田縣", "周寧縣", "其他" ] } ] }, { "name": "江西", "city": [ { "name": "南昌", "area": [ "東湖區", "西湖區", "青雲譜區", "灣裏區", "青山湖區", "新建縣", "南昌縣", "進賢縣", "安義縣", "其他" ] }, { "name": "景德鎮", "area": [ "珠山區", "昌江區", "樂平市", "浮梁縣", "其他" ] }, { "name": "萍鄉", "area": [ "安源區", "湘東區", "蓮花縣", "上栗縣", "蘆溪縣", "其他" ] }, { "name": "九江", "area": [ "潯陽區", "廬山區", "瑞昌市", "九江縣", "星子縣", "武寧縣", "彭澤縣", "永修縣", "修水縣", "湖口縣", "德安縣", "都昌縣", "其他" ] }, { "name": "新余", "area": [ "渝水區", "分宜縣", "其他" ] }, { "name": "鷹潭", "area": [ "月湖區", "貴溪市", "余江縣", "其他" ] }, { "name": "贛州", "area": [ "章貢區", "瑞金市", "南康市", "石城縣", "安遠縣", "贛縣", "寧都縣", "尋烏縣", "興國縣", "定南縣", "上猶縣", "於都縣", "龍南縣", "崇義縣", "信豐縣", "全南縣", "大余縣", "會昌縣", "其他" ] }, { "name": "吉安", "area": [ "吉州區", "青原區", "井岡山市", "吉安縣", "永豐縣", "永新縣", "新幹縣", "泰和縣", "峽江縣", "遂川縣", "安福縣", "吉水縣", "萬安縣", "其他" ] }, { "name": "宜春", "area": [ "袁州區", "豐城市", "樟樹市", "高安市", "銅鼓縣", "靖安縣", "宜豐縣", "奉新縣", "萬載縣", "上高縣", "其他" ] }, { "name": "撫州", "area": [ "臨川區", "南豐縣", "樂安縣", "金溪縣", "南城縣", "東鄉縣", "資溪縣", "宜黃縣", "廣昌縣", "黎川縣", "崇仁縣", "其他" ] }, { "name": "上饒", "area": [ "信州區", "德興市", "上饒縣", "廣豐縣", "鄱陽縣", "婺源縣", "鉛山縣", "余幹縣", "橫峰縣", "弋陽縣", "玉山縣", "萬年縣", "其他" ] } ] }, { "name": "山東", "city": [ { "name": "濟南", "area": [ "市中區", "歷下區", "天橋區", "槐蔭區", "歷城區", "長清區", "章丘市", "平陰縣", "濟陽縣", "商河縣", "其他" ] }, { "name": "青島", "area": [ "市南區", "市北區", "城陽區", "四方區", "李滄區", "黃島區", "嶗山區", "膠南市", "膠州市", "平度市", "萊西市", "即墨市", "其他" ] }, { "name": "淄博", "area": [ "張店區", "臨淄區", "淄川區", "博山區", "周村區", "桓臺縣", "高青縣", "沂源縣", "其他" ] }, { "name": "棗莊", "area": [ "市中區", "山亭區", "嶧城區", "臺兒莊區", "薛城區", "滕州市", "其他" ] }, { "name": "東營", "area": [ "東營區", "河口區", "墾利縣", "廣饒縣", "利津縣", "其他" ] }, { "name": "煙臺", "area": [ "芝罘區", "福山區", "牟平區", "萊山區", "龍口市", "萊陽市", "萊州市", "招遠市", "蓬萊市", "棲霞市", "海陽市", "長島縣", "其他" ] }, { "name": "濰坊", "area": [ "濰城區", "寒亭區", "坊子區", "奎文區", "青州市", "諸城市", "壽光市", "安丘市", "高密市", "昌邑市", "昌樂縣", "臨朐縣", "其他" ] }, { "name": "濟寧", "area": [ "市中區", "任城區", "曲阜市", "兗州市", "鄒城市", "魚臺縣", "金鄉縣", "嘉祥縣", "微山縣", "汶上縣", "泗水縣", "梁山縣", "其他" ] }, { "name": "泰安", "area": [ "泰山區", "岱嶽區", "新泰市", "肥城市", "寧陽縣", "東平縣", "其他" ] }, { "name": "威海", "area": [ "環翠區", "乳山市", "文登市", "榮成市", "其他" ] }, { "name": "日照", "area": [ "東港區", "嵐山區", "五蓮縣", "莒縣", "其他" ] }, { "name": "萊蕪", "area": [ "萊城區", "鋼城區", "其他" ] }, { "name": "臨沂", "area": [ "蘭山區", "羅莊區", "河東區", "沂南縣", "郯城縣", "沂水縣", "蒼山縣", "費縣", "平邑縣", "莒南縣", "蒙陰縣", "臨述縣", "其他" ] }, { "name": "德州", "area": [ "德城區", "樂陵市", "禹城市", "陵縣", "寧津縣", "齊河縣", "武城縣", "慶雲縣", "平原縣", "夏津縣", "臨邑縣", "其他" ] }, { "name": "聊城", "area": [ "東昌府區", "臨清市", "高唐縣", "陽谷縣", "茌平縣", "莘縣", "東阿縣", "冠縣", "其他" ] }, { "name": "濱州", "area": [ "濱城區", "鄒平縣", "沾化縣", "惠民縣", "博興縣", "陽信縣", "無棣縣", "其他" ] }, { "name": "菏澤", "area": [ "牡丹區", "鄄城縣", "單縣", "鄆城縣", "曹縣", "定陶縣", "巨野縣", "東明縣", "成武縣", "其他" ] } ] }, { "name": "河南", "city": [ { "name": "鄭州", "area": [ "中原區", "金水區", "二七區", "管城回族區", "上街區", "惠濟區", "鞏義市", "新鄭市", "新密市", "登封市", "滎陽市", "中牟縣", "其他" ] }, { "name": "開封", "area": [ "鼓樓區", "龍亭區", "順河回族區", "禹王臺區", "金明區", "開封縣", "尉氏縣", "蘭考縣", "杞縣", "通許縣", "其他" ] }, { "name": "洛陽", "area": [ "西工區", "老城區", "澗西區", "纏河回族區", "洛龍區", "吉利區", "偃師市", "孟津縣", "汝陽縣", "伊川縣", "洛寧縣", "嵩縣", "宜陽縣", "新安縣", "欒川縣", "其他" ] }, { "name": "平頂山", "area": [ "新華區", "衛東區", "湛河區", "石龍區", "汝州市", "舞鋼市", "寶豐縣", "葉縣", "郟縣", "魯山縣", "其他" ] }, { "name": "安陽", "area": [ "北關區", "文峰區", "殷都區", "龍安區", "林州市", "安陽縣", "滑縣", "內黃縣", "湯陰縣", "其他" ] }, { "name": "鶴壁", "area": [ "泣濱區", "山城區", "鶴山區", "浚縣", "泣縣", "其他" ] }, { "name": "新鄉", "area": [ "衛濱區", "紅旗區", "鳳泉區", "牧野區", "衛輝市", "輝縣市", "新鄉縣", "獲嘉縣", "原陽縣", "長垣縣", "封丘縣", "延津縣", "其他" ] }, { "name": "焦作", "area": [ "解放區", "中站區", "馬村區", "山陽區", "沁陽市", "孟州市", "修武縣", "溫縣", "武陟縣", "博愛縣", "其他" ] }, { "name": "濮陽", "area": [ "華龍區", "濮陽縣", "南樂縣", "臺前縣", "清豐縣", "範縣", "其他" ] }, { "name": "許昌", "area": [ "魏都區", "禹州市", "長葛市", "許昌縣", "鄢陵縣", "襄城縣", "其他" ] }, { "name": "漯河", "area": [ "源匯區", "郾城區", "召陵區", "臨潁縣", "舞陽縣", "其他" ] }, { "name": "三門峽", "area": [ "湖濱區", "義馬市", "靈寶市", "澠池縣", "盧氏縣", "陜縣", "其他" ] }, { "name": "南陽", "area": [ "臥龍區", "宛城區", "鄧州市", "桐柏縣", "方城縣", "浙川縣", "鎮平縣", "唐河縣", "南召縣", "內鄉縣", "新野縣", "社旗縣", "西峽縣", "其他" ] }, { "name": "商丘", "area": [ "梁園區", "睢陽區", "永城市", "寧陵縣", "虞城縣", "民權縣", "夏邑縣", "柘城縣", "睢縣", "其他" ] }, { "name": "信陽", "area": [ "獅河區", "平橋區", "潢川縣", "淮濱縣", "息縣", "新縣", "商城縣", "固始縣", "羅山縣", "光山縣", "其他" ] }, { "name": "周口", "area": [ "川匯區", "項城市", "商水縣", "淮陽縣", "太康縣", "鹿邑縣", "西華縣", "扶溝縣", "沈丘縣", "鄲城縣", "其他" ] }, { "name": "駐馬店", "area": [ "驛城區", "確山縣", "新蔡縣", "上蔡縣", "西平縣", "泌陽縣", "平輿縣", "汝南縣", "遂平縣", "正陽縣", "其他" ] }, { "name": "焦作", "area": [ "濟源市", "其他" ] } ] }, { "name": "湖北", "city": [ { "name": "武漢", "area": [ "江岸區", "武昌區", "江漢區", "硚口區", "漢陽區", "青山區", "洪山區", "東西湖區", "漢南區", "蔡甸區", "江夏區", "黃陂區", "新洲區", "其他" ] }, { "name": "黃石", "area": [ "黃石港區", "西塞山區", "下陸區", "鐵山區", "大冶市", "陽新縣", "其他" ] }, { "name": "十堰", "area": [ "張灣區", "茅箭區", "丹江口市", "鄖縣", "竹山縣", "房縣", "鄖西縣", "竹溪縣", "其他" ] }, { "name": "荊州", "area": [ "沙市區", "荊州區", "洪湖市", "石首市", "松滋市", "監利縣", "公安縣", "江陵縣", "其他" ] }, { "name": "宜昌", "area": [ "西陵區", "伍家崗區", "點軍區", "猇亭區", "夷陵區", "宜都市", "當陽市", "枝江市", "秭歸縣", "遠安縣", "興山縣", "五峰土家族自治縣", "長陽土家族自治縣", "其他" ] }, { "name": "襄樊", "area": [ "襄城區", "樊城區", "襄陽區", "老河口市", "棗陽市", "宜城市", "南漳縣", "谷城縣", "保康縣", "其他" ] }, { "name": "鄂州", "area": [ "鄂城區", "華容區", "梁子湖區", "其他" ] }, { "name": "荊門", "area": [ "東寶區", "掇刀區", "鐘祥市", "京山縣", "沙洋縣", "其他" ] }, { "name": "孝感", "area": [ "孝南區", "應城市", "安陸市", "漢川市", "雲夢縣", "大悟縣", "孝昌縣", "其他" ] }, { "name": "黃岡", "area": [ "黃州區", "麻城市", "武穴市", "紅安縣", "羅田縣", "稀水縣", "蘄春縣", "黃梅縣", "英山縣", "團風縣", "其他" ] }, { "name": "鹹寧", "area": [ "鹹安區", "赤壁市", "嘉魚縣", "通山縣", "崇陽縣", "通城縣", "其他" ] }, { "name": "隨州", "area": [ "曾都區", "廣水市", "其他" ] }, { "name": "恩施土家族苗族自治州", "area": [ "恩施市", "利川市", "建始縣", "來鳳縣", "巴東縣", "鶴峰縣", "宣恩縣", "鹹豐縣", "其他" ] }, { "name": "仙桃", "area": [ "" ] }, { "name": "天門", "area": [ "" ] }, { "name": "潛江", "area": [ "" ] }, { "name": "神農架林區", "area": [ "" ] } ] }, { "name": "湖南", "city": [ { "name": "長沙", "area": [ "嶽麓區", "芙蓉區", "天心區", "開福區", "雨花區", "瀏陽市", "長沙縣", "望城縣", "寧鄉縣", "其他" ] }, { "name": "株洲", "area": [ "天元區", "荷塘區", "蘆淞區", "石峰區", "醴陵市", "株洲縣", "炎陵縣", "茶陵縣", "攸縣", "其他" ] }, { "name": "湘潭", "area": [ "嶽塘區", "雨湖區", "湘鄉市", "韶山市", "湘潭縣", "其他" ] }, { "name": "衡陽", "area": [ "雁峰區", "珠暉區", "石鼓區", "蒸湘區", "南嶽區", "耒陽市", "常寧市", "衡陽縣", "衡東縣", "衡山縣", "衡南縣", "祁東縣", "其他" ] }, { "name": "邵陽", "area": [ "雙清區", "大祥區", "北塔區", "武岡市", "邵東縣", "洞口縣", "新邵縣", "綏寧縣", "新寧縣", "邵陽縣", "隆回縣", "城步苗族自治縣", "其他" ] }, { "name": "嶽陽", "area": [ "嶽陽樓區", "雲溪區", "君山區", "臨湘市", "淚羅市", "嶽陽縣", "湘陰縣", "平江縣", "華容縣", "其他" ] }, { "name": "常德", "area": [ "武陵區", "鼎城區", "津市市", "澧縣", "臨澧縣", "桃源縣", "漢壽縣", "安鄉縣", "石門縣", "其他" ] }, { "name": "張家界", "area": [ "永定區", "武陵源區", "慈利縣", "桑植縣", "其他" ] }, { "name": "益陽", "area": [ "赫山區", "資陽區", "元江市", "桃江縣", "南縣", "安化縣", "其他" ] }, { "name": "郴州", "area": [ "北湖區", "蘇仙區", "資興市", "宜章縣", "汝城縣", "安仁縣", "嘉禾縣", "臨武縣", "桂東縣", "永興縣", "桂陽縣", "其他" ] }, { "name": "永州", "area": [ "冷水灘區", "零陵區", "祁陽縣", "藍山縣", "寧遠縣", "新田縣", "東安縣", "江永縣", "道縣", "雙牌縣", "江華瑤族自治縣", "其他" ] }, { "name": "懷化", "area": [ "鶴城區", "洪江市", "會同縣", "元陵縣", "辰溪縣", "漵浦縣", "中方縣", "新晃侗族自治縣", "芝江侗族自治縣", "通道侗族自治縣", "靖州苗族侗族自治縣", "麻陽苗族自治縣", "其他" ] }, { "name": "婁底", "area": [ "婁星區", "冷水江市", "漣源市", "新化縣", "雙峰縣", "其他" ] }, { "name": "湘西土家族苗族自治州", "area": [ "吉首市", "古丈縣", "龍山縣", "永順縣", "鳳凰縣", "瀘溪縣", "保靖縣", "花垣縣", "其他" ] } ] }, { "name": "廣東", "city": [ { "name": "廣州", "area": [ "越秀區", "荔灣區", "海珠區", "天河區", "白雲區", "黃埔區", "番禺區", "花都區", "南沙區", "蘿崗區", "增城市", "從化市", "其他" ] }, { "name": "深圳", "area": [ "福田區", "羅湖區", "南山區", "寶安區", "龍崗區", "鹽田區", "其他" ] }, { "name": "東莞", "area": [ "莞城", "常平", "塘廈", "其他" ] }, { "name": "中山", "area": [ "" ] }, { "name": "潮州", "area": [ "湘橋區", "潮安縣", "饒平縣", "其他" ] }, { "name": "揭陽", "area": [ "榕城區", "揭東縣", "揭西縣", "惠來縣", "普寧市", "其他" ] }, { "name": "雲浮", "area": [ "雲城區", "新興縣", "郁南縣", "雲安縣", "羅定市", "其他" ] }, { "name": "珠海", "area": [ "香洲區", "鬥門區", "金灣區", "其他" ] }, { "name": "汕頭", "area": [ "金平區", "豪江區", "龍湖區", "潮陽區", "潮南區", "澄海區", "南澳縣", "其他" ] }, { "name": "韶關", "area": [ "湞江區", "武江區", "曲江區", "樂昌市", "南雄市", "始興縣", "仁化縣", "翁源縣", "新豐縣", "乳源瑤族自治縣", "其他" ] }, { "name": "佛山", "area": [ "禪城區", "南海區", "順德區", "三水區", "高明區", "其他" ] }, { "name": "江門", "area": [ "蓬江區", "江海區", "新會區", "恩平市", "臺山市", "開平市", "鶴山市", "其他" ] }, { "name": "湛江", "area": [ "赤坎區", "霞山區", "坡頭區", "麻章區", "吳川市", "廉江市", "雷州市", "遂溪縣", "徐聞縣", "其他" ] }, { "name": "茂名", "area": [ "茂南區", "茂港區", "化州市", "信宜市", "高州市", "電白縣", "其他" ] }, { "name": "肇慶", "area": [ "端州區", "鼎湖區", "高要市", "四會市", "廣寧縣", "懷集縣", "封開縣", "德慶縣", "其他" ] }, { "name": "惠州", "area": [ "惠城區", "惠陽區", "博羅縣", "惠東縣", "龍門縣", "其他" ] }, { "name": "梅州", "area": [ "梅江區", "興寧市", "梅縣", "大埔縣", "豐順縣", "五華縣", "平遠縣", "蕉嶺縣", "其他" ] }, { "name": "汕尾", "area": [ "城區", "陸豐市", "海豐縣", "陸河縣", "其他" ] }, { "name": "河源", "area": [ "源城區", "紫金縣", "龍川縣", "連平縣", "和平縣", "東源縣", "其他" ] }, { "name": "陽江", "area": [ "江城區", "陽春市", "陽西縣", "陽東縣", "其他" ] }, { "name": "清遠", "area": [ "清城區", "英德市", "連州市", "佛岡縣", "陽山縣", "清新縣", "連山壯族瑤族自治縣", "連南瑤族自治縣", "其他" ] } ] }, { "name": "廣西", "city": [ { "name": "南寧", "area": [ "青秀區", "興寧區", "西鄉塘區", "良慶區", "江南區", "邕寧區", "武鳴縣", "隆安縣", "馬山縣", "上林縣", "賓陽縣", "橫縣", "其他" ] }, { "name": "柳州", "area": [ "城中區", "魚峰區", "柳北區", "柳南區", "柳江縣", "柳城縣", "鹿寨縣", "融安縣", "融水苗族自治縣", "三江侗族自治縣", "其他" ] }, { "name": "桂林", "area": [ "象山區", "秀峰區", "疊彩區", "七星區", "雁山區", "陽朔縣", "臨桂縣", "靈川縣", "全州縣", "平樂縣", "興安縣", "灌陽縣", "荔浦縣", "資源縣", "永福縣", "龍勝各族自治縣", "恭城瑤族自治縣", "其他" ] }, { "name": "梧州", "area": [ "萬秀區", "蝶山區", "長洲區", "岑溪市", "蒼梧縣", "藤縣", "蒙山縣", "其他" ] }, { "name": "北海", "area": [ "海城區", "銀海區", "鐵山港區", "合浦縣", "其他" ] }, { "name": "防城港", "area": [ "港口區", "防城區", "東興市", "上思縣", "其他" ] }, { "name": "欽州", "area": [ "欽南區", "欽北區", "靈山縣", "浦北縣", "其他" ] }, { "name": "貴港", "area": [ "港北區", "港南區", "覃塘區", "桂平市", "平南縣", "其他" ] }, { "name": "玉林", "area": [ "玉州區", "北流市", "容縣", "陸川縣", "博白縣", "興業縣", "其他" ] }, { "name": "百色", "area": [ "右江區", "淩雲縣", "平果縣", "西林縣", "樂業縣", "德保縣", "田林縣", "田陽縣", "靖西縣", "田東縣", "那坡縣", "隆林各族自治縣", "其他" ] }, { "name": "賀州", "area": [ "八步區", "鐘山縣", "昭平縣", "富川瑤族自治縣", "其他" ] }, { "name": "河池", "area": [ "金城江區", "宜州市", "天峨縣", "鳳山縣", "南丹縣", "東蘭縣", "都安瑤族自治縣", "羅城仫佬族自治縣", "巴馬瑤族自治縣", "環江毛南族自治縣", "大化瑤族自治縣", "其他" ] }, { "name": "來賓", "area": [ "興賓區", "合山市", "象州縣", "武宣縣", "忻城縣", "金秀瑤族自治縣", "其他" ] }, { "name": "崇左", "area": [ "江州區", "憑祥市", "寧明縣", "扶綏縣", "龍州縣", "大新縣", "天等縣", "其他" ] } ] }, { "name": "海南", "city": [ { "name": "海口", "area": [ "龍華區", "秀英區", "瓊山區", "美蘭區", "其他" ] }, { "name": "三亞", "area": [ "三亞市", "其他" ] }, { "name": "五指山", "area": [ "" ] }, { "name": "瓊海", "area": [ "" ] }, { "name": "儋州", "area": [ "" ] }, { "name": "文昌", "area": [ "" ] }, { "name": "萬寧", "area": [ "" ] }, { "name": "東方", "area": [ "" ] }, { "name": "澄邁縣", "area": [ "" ] }, { "name": "定安縣", "area": [ "" ] }, { "name": "屯昌縣", "area": [ "" ] }, { "name": "臨高縣", "area": [ "" ] }, { "name": "白沙黎族自治縣", "area": [ "" ] }, { "name": "昌江黎族自治縣", "area": [ "" ] }, { "name": "樂東黎族自治縣", "area": [ "" ] }, { "name": "陵水黎族自治縣", "area": [ "" ] }, { "name": "保亭黎族苗族自治縣", "area": [ "" ] }, { "name": "瓊中黎族苗族自治縣", "area": [ "" ] } ] }, { "name": "重慶", "city": [ { "name": "重慶", "area": [ "渝中區", "大渡口區", "江北區", "南岸區", "北碚區", "渝北區", "巴南區", "長壽區", "雙橋區", "沙坪壩區", "萬盛區", "萬州區", "涪陵區", "黔江區", "永川區", "合川區", "江津區", "九龍坡區", "南川區", "綦江縣", "潼南縣", "榮昌縣", "璧山縣", "大足縣", "銅梁縣", "梁平縣", "開縣", "忠縣", "城口縣", "墊江縣", "武隆縣", "豐都縣", "奉節縣", "雲陽縣", "巫溪縣", "巫山縣", "石柱土家族自治縣", "秀山土家族苗族自治縣", "酉陽土家族苗族自治縣", "彭水苗族土家族自治縣", "其他" ] } ] }, { "name": "四川", "city": [ { "name": "成都", "area": [ "青羊區", "錦江區", "金牛區", "武侯區", "成華區", "龍泉驛區", "青白江區", "新都區", "溫江區", "都江堰市", "彭州市", "邛崍市", "崇州市", "金堂縣", "郫縣", "新津縣", "雙流縣", "蒲江縣", "大邑縣", "其他" ] }, { "name": "自貢", "area": [ "大安區", "自流井區", "貢井區", "沿灘區", "榮縣", "富順縣", "其他" ] }, { "name": "攀枝花", "area": [ "仁和區", "米易縣", "鹽邊縣", "東區", "西區", "其他" ] }, { "name": "瀘州", "area": [ "江陽區", "納溪區", "龍馬潭區", "瀘縣", "合江縣", "敘永縣", "古藺縣", "其他" ] }, { "name": "德陽", "area": [ "旌陽區", "廣漢市", "什邡市", "綿竹市", "羅江縣", "中江縣", "其他" ] }, { "name": "綿陽", "area": [ "涪城區", "遊仙區", "江油市", "鹽亭縣", "三臺縣", "平武縣", "安縣", "梓潼縣", "北川羌族自治縣", "其他" ] }, { "name": "廣元", "area": [ "元壩區", "朝天區", "青川縣", "旺蒼縣", "劍閣縣", "蒼溪縣", "市中區", "其他" ] }, { "name": "遂寧", "area": [ "船山區", "安居區", "射洪縣", "蓬溪縣", "大英縣", "其他" ] }, { "name": "內江", "area": [ "市中區", "東興區", "資中縣", "隆昌縣", "威遠縣", "其他" ] }, { "name": "樂山", "area": [ "市中區", "五通橋區", "沙灣區", "金口河區", "峨眉山市", "夾江縣", "井研縣", "犍為縣", "沐川縣", "馬邊彜族自治縣", "峨邊彜族自治縣", "其他" ] }, { "name": "南充", "area": [ "順慶區", "高坪區", "嘉陵區", "閬中市", "營山縣", "蓬安縣", "儀隴縣", "南部縣", "西充縣", "其他" ] }, { "name": "眉山", "area": [ "東坡區", "仁壽縣", "彭山縣", "洪雅縣", "丹棱縣", "青神縣", "其他" ] }, { "name": "宜賓", "area": [ "翠屏區", "宜賓縣", "興文縣", "南溪縣", "拱縣", "長寧縣", "高縣", "江安縣", "筠連縣", "屏山縣", "其他" ] }, { "name": "廣安", "area": [ "廣安區", "華鎣市", "嶽池縣", "鄰水縣", "武勝縣", "其他" ] }, { "name": "達州", "area": [ "通川區", "萬源市", "達縣", "渠縣", "宣漢縣", "開江縣", "大竹縣", "其他" ] }, { "name": "雅安", "area": [ "雨城區", "蘆山縣", "石棉縣", "名山縣", "天全縣", "滎經縣", "寶興縣", "漢源縣", "其他" ] }, { "name": "巴中", "area": [ "巴州區", "南江縣", "平昌縣", "通江縣", "其他" ] }, { "name": "資陽", "area": [ "雁江區", "簡陽市", "安嶽縣", "樂至縣", "其他" ] }, { "name": "阿壩藏族羌族自治州", "area": [ "馬爾康縣", "九寨溝縣", "紅原縣", "汶川縣", "阿壩縣", "理縣", "若爾蓋縣", "小金縣", "黑水縣", "金川縣", "松潘縣", "壤塘縣", "茂縣", "其他" ] }, { "name": "甘孜藏族自治州", "area": [ "康定縣", "丹巴縣", "爐霍縣", "九龍縣", "甘孜縣", "雅江縣", "新龍縣", "道孚縣", "白玉縣", "理塘縣", "德格縣", "鄉城縣", "石渠縣", "稻城縣", "色達縣", "巴塘縣", "瀘定縣", "得榮縣", "其他" ] }, { "name": "涼山彜族自治州", "area": [ "西昌市", "美姑縣", "昭覺縣", "金陽縣", "甘洛縣", "布拖縣", "雷波縣", "普格縣", "寧南縣", "喜德縣", "會東縣", "越西縣", "會理縣", "鹽源縣", "德昌縣", "冕寧縣", "木裏藏族自治縣", "其他" ] } ] }, { "name": "貴州", "city": [ { "name": "貴陽", "area": [ "南明區", "雲巖區", "花溪區", "烏當區", "白雲區", "小河區", "清鎮市", "開陽縣", "修文縣", "息烽縣", "其他" ] }, { "name": "六盤水", "area": [ "鐘山區", "水城縣", "盤縣", "六枝特區", "其他" ] }, { "name": "遵義", "area": [ "紅花崗區", "匯川區", "赤水市", "仁懷市", "遵義縣", "綏陽縣", "桐梓縣", "習水縣", "鳳岡縣", "正安縣", "余慶縣", "湄潭縣", "道真仡佬族苗族自治縣", "務川仡佬族苗族自治縣", "其他" ] }, { "name": "安順", "area": [ "西秀區", "普定縣", "平壩縣", "鎮寧布依族苗族自治縣", "紫雲苗族布依族自治縣", "關嶺布依族苗族自治縣", "其他" ] }, { "name": "銅仁地區", "area": [ "銅仁市", "德江縣", "江口縣", "思南縣", "石阡縣", "玉屏侗族自治縣", "松桃苗族自治縣", "印江土家族苗族自治縣", "沿河土家族自治縣", "萬山特區", "其他" ] }, { "name": "畢節地區", "area": [ "畢節市", "黔西縣", "大方縣", "織金縣", "金沙縣", "赫章縣", "納雍縣", "威寧彜族回族苗族自治縣", "其他" ] }, { "name": "黔西南布依族苗族自治州", "area": [ "興義市", "望謨縣", "興仁縣", "普安縣", "冊亨縣", "晴隆縣", "貞豐縣", "安龍縣", "其他" ] }, { "name": "黔東南苗族侗族自治州", "area": [ "凱裏市", "施秉縣", "從江縣", "錦屏縣", "鎮遠縣", "麻江縣", "臺江縣", "天柱縣", "黃平縣", "榕江縣", "劍河縣", "三穗縣", "雷山縣", "黎平縣", "岑鞏縣", "丹寨縣", "其他" ] }, { "name": "黔南布依族苗族自治州", "area": [ "都勻市", "福泉市", "貴定縣", "惠水縣", "羅甸縣", "甕安縣", "荔波縣", "龍裏縣", "平塘縣", "長順縣", "獨山縣", "三都水族自治縣", "其他" ] } ] }, { "name": "雲南", "city": [ { "name": "昆明", "area": [ "盤龍區", "五華區", "官渡區", "西山區", "東川區", "安寧市", "呈貢縣", "晉寧縣", "富民縣", "宜良縣", "嵩明縣", "石林彜族自治縣", "祿勸彜族苗族自治縣", "尋甸回族彜族自治縣", "其他" ] }, { "name": "曲靖", "area": [ "麒麟區", "宣威市", "馬龍縣", "沾益縣", "富源縣", "羅平縣", "師宗縣", "陸良縣", "會澤縣", "其他" ] }, { "name": "玉溪", "area": [ "紅塔區", "江川縣", "澄江縣", "通海縣", "華寧縣", "易門縣", "峨山彜族自治縣", "新平彜族傣族自治縣", "元江哈尼族彜族傣族自治縣", "其他" ] }, { "name": "保山", "area": [ "隆陽區", "施甸縣", "騰沖縣", "龍陵縣", "昌寧縣", "其他" ] }, { "name": "昭通", "area": [ "昭陽區", "魯甸縣", "巧家縣", "鹽津縣", "大關縣", "永善縣", "綏江縣", "鎮雄縣", "彜良縣", "威信縣", "水富縣", "其他" ] }, { "name": "麗江", "area": [ "古城區", "永勝縣", "華坪縣", "玉龍納西族自治縣", "寧蒗彜族自治縣", "其他" ] }, { "name": "普洱", "area": [ "思茅區", "普洱哈尼族彜族自治縣", "墨江哈尼族自治縣", "景東彜族自治縣", "景谷傣族彜族自治縣", "鎮元彜族哈尼族拉祜族自治縣", "江城哈尼族彜族自治縣", "孟連傣族拉祜族佤族自治縣", "瀾滄拉祜族自治縣", "西盟佤族自治縣", "其他" ] }, { "name": "臨滄", "area": [ "臨翔區", "鳳慶縣", "雲縣", "永德縣", "鎮康縣", "雙江拉祜族佤族布朗族傣族自治縣", "耿馬傣族佤族自治縣", "滄源佤族自治縣", "其他" ] }, { "name": "德宏傣族景頗族自治州", "area": [ "潞西市", "瑞麗市", "梁河縣", "盈江縣", "隴川縣", "其他" ] }, { "name": "怒江傈僳族自治州", "area": [ "瀘水縣", "福貢縣", "貢山獨龍族怒族自治縣", "蘭坪白族普米族自治縣", "其他" ] }, { "name": "迪慶藏族自治州", "area": [ "香格裏拉縣", "德欽縣", "維西傈僳族自治縣", "其他" ] }, { "name": "大理白族自治州", "area": [ "大理市", "祥雲縣", "賓川縣", "彌渡縣", "永平縣", "雲龍縣", "洱源縣", "劍川縣", "鶴慶縣", "漾濞彜族自治縣", "南澗彜族自治縣", "巍山彜族回族自治縣", "其他" ] }, { "name": "楚雄彜族自治州", "area": [ "楚雄市", "雙柏縣", "牟定縣", "南華縣", "姚安縣", "大姚縣", "永仁縣", "元謀縣", "武定縣", "祿豐縣", "其他" ] }, { "name": "紅河哈尼族彜族自治州", "area": [ "蒙自縣", "個舊市", "開遠市", "綠春縣", "建水縣", "石屏縣", "彌勒縣", "瀘西縣", "元陽縣", "紅河縣", "金平苗族瑤族傣族自治縣", "河口瑤族自治縣", "屏邊苗族自治縣", "其他" ] }, { "name": "文山壯族苗族自治州", "area": [ "文山縣", "硯山縣", "西疇縣", "麻栗坡縣", "馬關縣", "丘北縣", "廣南縣", "富寧縣", "其他" ] }, { "name": "西雙版納傣族自治州", "area": [ "景洪市", "猛海縣", "猛臘縣", "其他" ] } ] }, { "name": "西藏", "city": [ { "name": "拉薩", "area": [ "城關區", "林周縣", "當雄縣", "尼木縣", "曲水縣", "堆龍德慶縣", "達孜縣", "墨竹工卡縣", "其他" ] }, { "name": "那曲地區", "area": [ "那曲縣", "嘉黎縣", "比如縣", "聶榮縣", "安多縣", "申紮縣", "索縣", "班戈縣", "巴青縣", "尼瑪縣", "其他" ] }, { "name": "昌都地區", "area": [ "昌都縣", "江達縣", "貢覺縣", "類烏齊縣", "丁青縣", "察雅縣", "八宿縣", "左貢縣", "芒康縣", "洛隆縣", "邊壩縣", "其他" ] }, { "name": "林芝地區", "area": [ "林芝縣", "工布江達縣", "米林縣", "墨脫縣", "波密縣", "察隅縣", "朗縣", "其他" ] }, { "name": "山南地區", "area": [ "乃東縣", "紮囊縣", "貢嘎縣", "桑日縣", "瓊結縣", "曲松縣", "措美縣", "洛紮縣", "加查縣", "隆子縣", "錯那縣", "浪卡子縣", "其他" ] }, { "name": "日喀則地區", "area": [ "日喀則市", "南木林縣", "江孜縣", "定日縣", "薩迦縣", "拉孜縣", "昂仁縣", "謝通門縣", "白朗縣", "仁布縣", "康馬縣", "定結縣", "仲巴縣", "亞東縣", "吉隆縣", "聶拉木縣", "薩嘎縣", "崗巴縣", "其他" ] }, { "name": "阿裏地區", "area": [ "噶爾縣", "普蘭縣", "劄達縣", "日土縣", "革吉縣", "改則縣", "措勤縣", "其他" ] } ] }, { "name": "陝西", "city": [ { "name": "西安", "area": [ "蓮湖區", "新城區", "碑林區", "雁塔區", "灞橋區", "未央區", "閻良區", "臨潼區", "長安區", "高陵縣", "藍田縣", "戶縣", "周至縣", "其他" ] }, { "name": "銅川", "area": [ "耀州區", "王益區", "印臺區", "宜君縣", "其他" ] }, { "name": "寶雞", "area": [ "渭濱區", "金臺區", "陳倉區", "岐山縣", "鳳翔縣", "隴縣", "太白縣", "麟遊縣", "扶風縣", "千陽縣", "眉縣", "鳳縣", "其他" ] }, { "name": "鹹陽", "area": [ "秦都區", "渭城區", "楊陵區", "興平市", "禮泉縣", "涇陽縣", "永壽縣", "三原縣", "彬縣", "旬邑縣", "長武縣", "乾縣", "武功縣", "淳化縣", "其他" ] }, { "name": "渭南", "area": [ "臨渭區", "韓城市", "華陰市", "蒲城縣", "潼關縣", "白水縣", "澄城縣", "華縣", "合陽縣", "富平縣", "大荔縣", "其他" ] }, { "name": "延安", "area": [ "寶塔區", "安塞縣", "洛川縣", "子長縣", "黃陵縣", "延川縣", "富縣", "延長縣", "甘泉縣", "宜川縣", "誌丹縣", "黃龍縣", "吳起縣", "其他" ] }, { "name": "漢中", "area": [ "漢臺區", "留壩縣", "鎮巴縣", "城固縣", "南鄭縣", "洋縣", "寧強縣", "佛坪縣", "勉縣", "西鄉縣", "略陽縣", "其他" ] }, { "name": "榆林", "area": [ "榆陽區", "清澗縣", "綏德縣", "神木縣", "佳縣", "府谷縣", "子洲縣", "靖邊縣", "橫山縣", "米脂縣", "吳堡縣", "定邊縣", "其他" ] }, { "name": "安康", "area": [ "漢濱區", "紫陽縣", "嵐臯縣", "旬陽縣", "鎮坪縣", "平利縣", "石泉縣", "寧陜縣", "白河縣", "漢陰縣", "其他" ] }, { "name": "商洛", "area": [ "商州區", "鎮安縣", "山陽縣", "洛南縣", "商南縣", "丹鳳縣", "柞水縣", "其他" ] } ] }, { "name": "甘肅", "city": [ { "name": "蘭州", "area": [ "城關區", "七裏河區", "西固區", "安寧區", "紅古區", "永登縣", "臯蘭縣", "榆中縣", "其他" ] }, { "name": "嘉峪關", "area": [ "嘉峪關市", "其他" ] }, { "name": "金昌", "area": [ "金川區", "永昌縣", "其他" ] }, { "name": "白銀", "area": [ "白銀區", "平川區", "靖遠縣", "會寧縣", "景泰縣", "其他" ] }, { "name": "天水", "area": [ "清水縣", "秦安縣", "甘谷縣", "武山縣", "張家川回族自治縣", "北道區", "秦城區", "其他" ] }, { "name": "武威", "area": [ "涼州區", "民勤縣", "古浪縣", "天祝藏族自治縣", "其他" ] }, { "name": "酒泉", "area": [ "肅州區", "玉門市", "敦煌市", "金塔縣", "肅北蒙古族自治縣", "阿克塞哈薩克族自治縣", "安西縣", "其他" ] }, { "name": "張掖", "area": [ "甘州區", "民樂縣", "臨澤縣", "高臺縣", "山丹縣", "肅南裕固族自治縣", "其他" ] }, { "name": "慶陽", "area": [ "西峰區", "慶城縣", "環縣", "華池縣", "合水縣", "正寧縣", "寧縣", "鎮原縣", "其他" ] }, { "name": "平涼", "area": [ "崆峒區", "涇川縣", "靈臺縣", "崇信縣", "華亭縣", "莊浪縣", "靜寧縣", "其他" ] }, { "name": "定西", "area": [ "安定區", "通渭縣", "臨桃縣", "漳縣", "岷縣", "渭源縣", "隴西縣", "其他" ] }, { "name": "隴南", "area": [ "武都區", "成縣", "宕昌縣", "康縣", "文縣", "西和縣", "禮縣", "兩當縣", "徽縣", "其他" ] }, { "name": "臨夏回族自治州", "area": [ "臨夏市", "臨夏縣", "康樂縣", "永靖縣", "廣河縣", "和政縣", "東鄉族自治縣", "積石山保安族東鄉族撒拉族自治縣", "其他" ] }, { "name": "甘南藏族自治州", "area": [ "合作市", "臨潭縣", "卓尼縣", "舟曲縣", "叠部縣", "瑪曲縣", "碌曲縣", "夏河縣", "其他" ] } ] }, { "name": "青海", "city": [ { "name": "西寧", "area": [ "城中區", "城東區", "城西區", "城北區", "湟源縣", "湟中縣", "大通回族土族自治縣", "其他" ] }, { "name": "海東地區", "area": [ "平安縣", "樂都縣", "民和回族土族自治縣", "互助土族自治縣", "化隆回族自治縣", "循化撒拉族自治縣", "其他" ] }, { "name": "海北藏族自治州", "area": [ "海晏縣", "祁連縣", "剛察縣", "門源回族自治縣", "其他" ] }, { "name": "海南藏族自治州", "area": [ "共和縣", "同德縣", "貴德縣", "興海縣", "貴南縣", "其他" ] }, { "name": "黃南藏族自治州", "area": [ "同仁縣", "尖紮縣", "澤庫縣", "河南蒙古族自治縣", "其他" ] }, { "name": "果洛藏族自治州", "area": [ "瑪沁縣", "班瑪縣", "甘德縣", "達日縣", "久治縣", "瑪多縣", "其他" ] }, { "name": "玉樹藏族自治州", "area": [ "玉樹縣", "雜多縣", "稱多縣", "治多縣", "囊謙縣", "曲麻萊縣", "其他" ] }, { "name": "海西蒙古族藏族自治州", "area": [ "德令哈市", "格爾木市", "烏蘭縣", "都蘭縣", "天峻縣", "其他" ] } ] }, { "name": "寧夏", "city": [ { "name": "銀川", "area": [ "興慶區", "西夏區", "金鳳區", "靈武市", "永寧縣", "賀蘭縣", "其他" ] }, { "name": "石嘴山", "area": [ "大武口區", "惠農區", "平羅縣", "其他" ] }, { "name": "吳忠", "area": [ "利通區", "青銅峽市", "鹽池縣", "同心縣", "其他" ] }, { "name": "固原", "area": [ "原州區", "西吉縣", "隆德縣", "涇源縣", "彭陽縣", "其他" ] }, { "name": "中衛", "area": [ "沙坡頭區", "中寧縣", "海原縣", "其他" ] } ] }, { "name": "新疆", "city": [ { "name": "烏魯木齊", "area": [ "天山區", "沙依巴克區", "新市區", "水磨溝區", "頭屯河區", "達阪城區", "東山區", "烏魯木齊縣", "其他" ] }, { "name": "克拉瑪依", "area": [ "克拉瑪依區", "獨山子區", "白堿灘區", "烏爾禾區", "其他" ] }, { "name": "吐魯番地區", "area": [ "吐魯番市", "托克遜縣", "鄯善縣", "其他" ] }, { "name": "哈密地區", "area": [ "哈密市", "伊吾縣", "巴裏坤哈薩克自治縣", "其他" ] }, { "name": "和田地區", "area": [ "和田市", "和田縣", "洛浦縣", "民豐縣", "皮山縣", "策勒縣", "於田縣", "墨玉縣", "其他" ] }, { "name": "阿克蘇地區", "area": [ "阿克蘇市", "溫宿縣", "沙雅縣", "拜城縣", "阿瓦提縣", "庫車縣", "柯坪縣", "新和縣", "烏什縣", "其他" ] }, { "name": "喀什地區", "area": [ "喀什市", "巴楚縣", "澤普縣", "伽師縣", "葉城縣", "嶽普湖縣", "疏勒縣", "麥蓋提縣", "英吉沙縣", "莎車縣", "疏附縣", "塔什庫爾幹塔吉克自治縣", "其他" ] }, { "name": "克孜勒蘇柯爾克孜自治州", "area": [ "阿圖什市", "阿合奇縣", "烏恰縣", "阿克陶縣", "其他" ] }, { "name": "巴音郭楞蒙古自治州", "area": [ "庫爾勒市", "和靜縣", "尉犁縣", "和碩縣", "且末縣", "博湖縣", "輪臺縣", "若羌縣", "焉耆回族自治縣", "其他" ] }, { "name": "昌吉回族自治州", "area": [ "昌吉市", "阜康市", "奇臺縣", "瑪納斯縣", "吉木薩爾縣", "呼圖壁縣", "木壘哈薩克自治縣", "米泉市", "其他" ] }, { "name": "博爾塔拉蒙古自治州", "area": [ "博樂市", "精河縣", "溫泉縣", "其他" ] }, { "name": "石河子", "area": [ "" ] }, { "name": "阿拉爾", "area": [ "" ] }, { "name": "圖木舒克", "area": [ "" ] }, { "name": "五家渠", "area": [ "" ] }, { "name": "伊犁哈薩克自治州", "area": [ "伊寧市", "奎屯市", "伊寧縣", "特克斯縣", "尼勒克縣", "昭蘇縣", "新源縣", "霍城縣", "鞏留縣", "察布查爾錫伯自治縣", "塔城地區", "阿勒泰地區", "其他" ] } ] }, { "name": "其他", "city": [ { "name": "", "area": [ "" ] } ] } ] ================================================ FILE: example/src/MainPage.js ================================================ import React, { Component } from 'react'; import { View, Text, TouchableOpacity, Modal } from 'react-native'; import { BaseComponent, BaseDialog, AreaPicker, CustomPicker, DatePicker, InputDialog, PickerView, SimpleChooseDialog, SimpleItemsDialog, AlertDialog, DownloadDialog, ToastComponent } from 'react-native-pickers'; import AreaJson from './Area.json'; export default class MainPage extends BaseComponent { constructor(props) { super(props); this.state = { unit: ['年', '月', '日'], startYear: 1900, active: false, modalVisible: false } } startDownload() { let count = 0; this.setState({ active: false }) this.interval = setInterval(() => { if (count > 100) { //下载完成 this.setState({ active: true }) clearInterval(this.interval); return; } this.DownloadDialog.setProcess(count / 100, '4.23MB'); count++; count++; }, 100); } renderButton(text, callback) { return {text} } render() { return {this.renderButton('AlertDialog', () => { this.AlertDialog.show() })} {this.renderButton('SimpleItemsDialog', () => { this.SimpleItemsDialog.show() })} {this.renderButton('SimpleChooseDialog', () => { this.SimpleChooseDialog.show() })} {this.renderButton('InputDialog', () => { this.InputDialog.show() })} {this.renderButton('最简单的自定义picker', () => { this.CustomPicker.show() })} {this.renderButton('行政区域picker', () => { this.AreaPicker.show() })} {this.renderButton('DatePicker', () => { this.DatePicker.show() })} {this.renderButton('DatePicker1', () => { this.DatePicker1.show() })} {this.renderButton('实现全屏覆盖', () => { console.log('xxxxx'); this.setState({modalVisible: true}, ()=>{this.SimpleChooseDialog1.show();}); })} {this.renderButton('下载进度', () => { this.DownloadDialog.show(); this.startDownload(); })} {this.renderButton('showToast', () => { this.ToastComponent.show('给个星星呗~') })} { alert(isOK ? 'ok' : 'cancel'); }} ref={ref => this.AlertDialog = ref} /> this.SimpleItemsDialog = ref} onPress={(which) => { alert(which) }} /> this.SimpleChooseDialog = ref} onPress={(which) => { alert(which) }} /> this.InputDialog = ref} onSubmit={(text) => { alert(text) }} /> this.CustomPicker = ref} /> { }} onPickerConfirm={(value) => { alert(JSON.stringify(value)); }} ref={ref => this.AreaPicker = ref} /> { alert(JSON.stringify(value)) }} onPickerCancel={() => { alert('cancel') }} ref={ref => this.DatePicker = ref} /> { alert(JSON.stringify(value)) }} onPickerCancel={() => { alert('cancel') }} ref={ref => this.DatePicker1 = ref} /> { alert('打开') }} onCoverPress={() => { this.interval && clearInterval(this.interval) }} ref={ref => this.DownloadDialog = ref} /> this.ToastComponent = ref} /> { }} > this.SimpleChooseDialog1 = ref} onCoverPress={()=>{ this.setState({modalVisible: false}); }} onPress={(which) => { console.log(which); this.setState({modalVisible: false}); }} /> } } ================================================ FILE: index.js ================================================ import AlertDialog from './view/AlertDialog'; import AreaPicker from './view/AreaPicker'; import CustomPicker from './CustomPicker'; import DatePicker from './view/DatePicker'; import InputDialog from './view/InputDialog'; import SimpleChooseDialog from './view/SimpleChooseDialog'; import SimpleItemsDialog from './view/SimpleItemsDialog'; import BaseComponent from './view/BaseComponent'; import BaseDialog from './view/BaseDialog'; import PickerView from './view/PickerView'; import DownloadDialog from './view/DownloadDialog'; import ToastComponent from './view/ToastComponent'; export { BaseComponent, BaseDialog, AreaPicker, CustomPicker, DatePicker, InputDialog, PickerView, SimpleChooseDialog, SimpleItemsDialog, AlertDialog, DownloadDialog, ToastComponent }; ================================================ FILE: package.json ================================================ { "name": "react-native-pickers", "version": "2.0.0", "description": "纯JS实现的React-Native 各种弹窗、日期选择控件、地址选择控件等", "main": "index.js", "repository": { "type": "git", "url": "git+https://github.com/iberHK/react-native-picker.git" }, "bugs": { "url": "https://github.com/iberHK/react-native-picker/issues" }, "homepage": "https://github.com/iberHK/react-native-picker", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "React Native", "picker", "pickers", "dialog" ], "author": "iBerHK", "license": "ISC" } ================================================ FILE: utils/TimeUtils.js ================================================ function getDaysInOneMonth(year, month) { var d = new Date(year, month, 0); return d.getDate(); } export default module.export = { getDaysInOneMonth } ================================================ FILE: view/AlertDialog.js ================================================ import React, { Component } from 'react'; import { View, Text, TouchableOpacity } from 'react-native'; import BaseDialog from './BaseDialog'; class AlertDialog extends BaseDialog { static defaultProps = { messageText: 'Alert Message', messageTextColor: '#444444', messageTextSize: 14, negativeText: 'cancel', negativeColor: '#666666', negativeSize: 16, positiveText: 'ok', positiveColor: '#1097D5', positiveSize: 16, onPress: null } constructor(props) { super(props); } _getContentPosition() { return { justifyContent: 'center', alignItems: 'center' } } renderContent() { return {this.props.messageText} { this.dismiss(() => { if (this.props.onPress) { this.props.onPress(true); } }); }} style={{ flex: 1, height: this.getSize(45), alignItems: 'center', justifyContent: 'center' }}> {this.props.positiveText} { this.dismiss(() => { if (this.props.onPress) { this.props.onPress(false); } }); }} style={{ flex: 1, height: this.getSize(45), alignItems: 'center', justifyContent: 'center' }}> {this.props.negativeText} } } export default AlertDialog; ================================================ FILE: view/AreaPicker.js ================================================ import React, { Component, UIManager } from 'react'; import { Text, View, Animated, TouchableOpacity } from 'react-native'; import PickerView from './PickerView'; import BaseDialog from './BaseDialog'; class AreaPicker extends BaseDialog { static defaultProps = { removeSubviews: false, selectedValue: ['香港', '香港', '中西區'], areaJson: null, confirmText: '确定', confirmTextSize: 14, confirmTextColor: '#333333', cancelText: '取消', cancelTextSize: 14, cancelTextColor: '#333333', itemTextColor: 0x333333ff, itemSelectedColor: 0x1097D5ff, itemHeight: 40, onPickerCancel: null, onPickerConfirm: null } constructor(props) { super(props); this.state = { areaData: this.getAreaData(), path: new Animated.Value(0), ...this.formatPickerData(props.selectedValue) }; } _getContentPosition() { return { justifyContent: 'flex-end', alignItems: 'center' } } getAreaData() { let area = this.props.areaJson; let data = []; let len = area.length; for (let i = 0; i < len; i++) { let city = []; for (let j = 0, cityLen = area[i]['city'].length; j < cityLen; j++) { let _city = {}; _city[area[i]['city'][j]['name']] = area[i]['city'][j]['area']; city.push(_city); } let _data = {}; _data[area[i]['name']] = city; data.push(_data); } return data; } formatPickerData() { let province = []; let city = []; let county = []; let firstCity = null; let firstCountry = null; let areaData = this.getAreaData(); areaData.map((pitem) => { for (let pname in pitem) { province.push(pname) if (pname == this.props.selectedValue[0]) { pitem[pname].map(citem => { for (let cname in citem) { if (firstCity == null) { firstCity = cname; } city.push(cname); if (cname == this.props.selectedValue[1]) { county = citem[cname]; if (firstCountry == null) { firstCountry = citem[cname][0]; } } } }); } } }); if (county.indexOf(this.props.selectedValue[2]) == -1) { this.props.selectedValue[2] = firstCountry; } if (county.length == 0 && firstCity != null) { this.props.selectedValue[1] = firstCity; return this.formatPickerData(); } return { pickerData: [province, city, county], visible: true }; } renderPicker() { return this.state.pickerData.map((item, pickerId) => { let selectedIndex = 0; let length = item.length; for (let i = 0; i < length; i++) { if (item[i] == this.props.selectedValue[pickerId]) { selectedIndex = i; break; } } if (item && length > 0) { return { this.props.selectedValue[pickerId] = toValue; this.setState({ ...this.formatPickerData(this.props.selectedValue) }); }} selectedIndex={selectedIndex} fontSize={this.getSize(14)} itemWidth={this.mScreenWidth / this.state.pickerData.length} itemHeight={this.props.itemHeight} /> } else { return null; } }); } renderContent() { return {this.renderPicker()} { this.dismiss(() => { this.props.onPickerCancel && this.props.onPickerCancel(); }); }} style={{ width: this.getSize(60), height: this.getSize(44), justifyContent: 'center', alignItems: 'center' }}> {this.props.cancelText} { this.dismiss(() => { this.props.onPickerConfirm && this.props.onPickerConfirm(this.props.selectedValue); }); }} style={{ width: this.getSize(60), height: this.getSize(44), justifyContent: 'center', alignItems: 'center' }}> {this.props.confirmText} } } export default AreaPicker; ================================================ FILE: view/BaseComponent.js ================================================ import React, { Component } from 'react'; import { Dimensions, PixelRatio } from 'react-native'; class BaseComponent extends Component { mScreenWidth = Dimensions.get('window').width; mScreenHeight = Dimensions.get('window').height; //最小显示单位 mOnePixel = (PixelRatio.get() == 3 ? 2 : 1) / PixelRatio.get(); constructor(props) { super(props); } /** * return 當前分辨率下的數值 * @param {*} size 375标注图下的值 */ getSize(size) { return parseInt(this.mScreenWidth * size / 375); } } export default BaseComponent; ================================================ FILE: view/BaseDialog.js ================================================ import React, { Component } from 'react'; import { Animated, TouchableOpacity, Platform } from 'react-native'; import BaseComponent from './BaseComponent'; export default class BaseDialog extends BaseComponent { static defaultProps = { removeSubviews: true, //隐藏时,是否回收前景控件,false 更流畅,true:初始化更快,dismiss后就回收 coverClickable: true, onCoverPress: null, showAnimationType: 'spring' } _path = new Animated.Value(0); constructor(props) { super(props); this.state = { _isShow: false } } isShowing() { return this.state._isShow; } show(callback, state = {}) { this.setState({ _isShow: true, ...state }, () => { if (!this.props.showAnimationType || this.props.showAnimationType == 'spring') { Animated.spring(this._path, { toValue: 1 }).start(() => { callback && callback(); }); } else { Animated.timing(this._path, { toValue: 1 }).start(() => { callback && callback(); }); } }); } dismiss(callback) { Animated.timing(this._path, { toValue: 0, duration: 200 }).start(() => { this.setState({ _isShow: false }, () => { callback && callback(); }); }); } /** * 重写前景动画效果 * @param {*} path */ _getContentInterpolate(path) { return [ { translateY: path.interpolate( { inputRange: [0, 0.5, 1], outputRange: [this.getSize(200), this.getSize(200), 0] } ) } ] } /** * 前景位置 */ _getContentPosition() { return { justifyContent: 'center', alignItems: 'center' } } /** * 绘制前景控件 */ renderContent() { return null; } render() { if (this.state._isShow || (this.props && this.props.removeSubviews === false)) { return { if (!this.props || (this.props.coverClickable || this.props.coverClickable == null)) { this.dismiss(this.props.onCoverPress); } }} style={{ position: 'absolute', width: this.mScreenWidth, height: this.mScreenHeight }} /> {this.renderContent()} } else { return null; } } } ================================================ FILE: view/DatePicker.js ================================================ import React, { Component, UIManager } from 'react'; import { Text, View, TouchableOpacity } from 'react-native'; import PickerView from './PickerView'; import BaseDialog from './BaseDialog'; import TimeUtils from '../utils/TimeUtils'; class DatePicker extends BaseDialog { static defaultProps = { removeSubviews: false, itemTextColor: 0x333333ff, itemSelectedColor: 0x1097D5ff, onPickerCancel: null, onPickerConfirm: null, unit: ['年', '月', '日'], selectedValue: [new Date().getFullYear() + '年', new Date().getMonth() + 1 + '月', new Date().getDate() + '日'], startYear: 1990, endYear: new Date().getFullYear(), confirmText: '确定', confirmTextSize: 14, confirmTextColor: '#333333', cancelText: '取消', cancelTextSize: 14, cancelTextColor: '#333333', itemHeight: 40, HH: true, mm: true, ss: false } constructor(props) { super(props); this.state = this.getDateList(); } getDateList() { console.log(this.props) let unit = this.props.unit; let years = []; let months = []; let days = []; let startYear = this.props.startYear; let endYear = this.props.endYear; for (let i = 0; i < endYear + 1 - startYear; i++) { years.push(i + startYear + unit[0]); } let selectedYear = years[0]; if (this.props.selectedValue) { selectedYear = this.props.selectedValue[0]; } selectedYear = selectedYear.substr(0, selectedYear.length - unit[0].length); for (let i = 1; i < 13; i++) { months.push(i + unit[1]); } let selectedMonth = months[0]; if (this.props.selectedValue) { selectedMonth = this.props.selectedValue[1]; } selectedMonth = selectedMonth.substr(0, selectedMonth.length - unit[1].length); let dayCount = TimeUtils.getDaysInOneMonth(selectedYear, selectedMonth); for (let i = 1; i <= dayCount; i++) { days.push(i + unit[2]); } let selectedDay = days[0]; if (this.props.selectedValue) { selectedDay = this.props.selectedValue[2]; } selectedDay = selectedDay.substr(0, selectedDay.length - unit[2].length); pickerData = [years, months, days]; selectedIndex = [ years.indexOf(selectedYear + unit[0]) == -1 ? years.length - 1 : years.indexOf(selectedYear + unit[0]), months.indexOf(selectedMonth + unit[1]), days.indexOf(selectedDay + unit[2]) == -1 ? days.length - 1 : days.indexOf(selectedDay + unit[2])]; this.props.selectedValue[0] = years[selectedIndex[0]]; this.props.selectedValue[1] = months[selectedIndex[1]]; this.props.selectedValue[2] = days[selectedIndex[2]]; if (this.props.HH) { let hours = []; for (let i = 0; i < 24; i++) { hours.push((i + 1) + '时'); } pickerData.push(hours); if (this.props.selectedValue) { selectedIndex.push((this.props.selectedValue[3] ? parseInt(this.props.selectedValue[3]) : new Date().getHours()) - 1); } else { selectedIndex.push((new Date().getHours() - 1)); } this.props.selectedValue[3] = (selectedIndex[3] + 1) + '时'; if (this.props.mm) { let minutes = []; for (let i = 0; i < 60; i++) { minutes.push((i + 1) + '分'); } pickerData.push(minutes); if (this.props.selectedValue) { selectedIndex.push((this.props.selectedValue[4] ? parseInt(this.props.selectedValue[4]) : new Date().getMinutes()) - 1); } else { selectedIndex.push((new Date().getMinutes() - 1)); } this.props.selectedValue[4] = (selectedIndex[4] + 1) + '分'; if (this.props.ss) { let seconds = []; for (let i = 0; i < 60; i++) { seconds.push((i + 1) + '秒'); } pickerData.push(seconds); if (this.props.selectedValue) { selectedIndex.push((this.props.selectedValue[5] ? parseInt(this.props.selectedValue[5]) : 1) - 1); } else { selectedIndex.push(1); } this.props.selectedValue[5] = (selectedIndex[5] + 1) + '秒'; } } } let data = { pickerData: pickerData, selectedIndex: selectedIndex, }; return data; } _getContentPosition() { return { justifyContent: 'flex-end', alignItems: 'center' } } renderPicker() { return this.state.pickerData.map((item, pickerId) => { if (item) { return { //是否联动的实现位置 this.props.selectedValue[pickerId] = toValue; console.log('====') this.setState({ ...this.getDateList() }); }} selectedIndex={this.state.selectedIndex[pickerId]} fontSize={this.getSize(14)} itemWidth={this.mScreenWidth / this.state.pickerData.length} itemHeight={this.props.itemHeight} /> } }); } renderContent() { // let data = this.getDateList(); // this.state.pickerData = data.pickerData; // this.state.selectedIndex = data.selectedIndex; return {this.renderPicker()} { this.dismiss(() => this.props.onPickerCancel && this.props.onPickerCancel(this.props.selectedValue)); }} style={{ width: this.getSize(60), height: this.getSize(44), justifyContent: 'center', alignItems: 'center' }}> {this.props.cancelText} { this.dismiss(() => this.props.onPickerConfirm && this.props.onPickerConfirm(this.props.selectedValue)); }} style={{ width: this.getSize(60), height: this.getSize(44), justifyContent: 'center', alignItems: 'center' }}> {this.props.confirmText} } } export default DatePicker; ================================================ FILE: view/DownloadDialog.js ================================================ import React, { Component } from 'react'; import { View, Animated, Text, TouchableOpacity, } from 'react-native'; import BaseDialog from './BaseDialog'; class DownloadDialog extends BaseDialog { static defaultProps = { title: '视频下载', titleColor: '#333333', titleSize: 14, active: false, actionText: '打开', onAction: null, totalTextColor: '#666666', totalTextSize: 12 } process = new Animated.Value(0); constructor(props) { super(props); this.state = { } } /** * * @param {*} process [0, 1] * @param {*} total */ setProcess(process, total) { if (this.state.total != total) { this.setState({ total }); } Animated.spring(this.process, { toValue: process }).start(); } renderContent() { return {this.props.title} {this.state.total} { if (this.props.active) { this.dismiss(() => { this.process.setValue(0); this.props.active = false; this.props.onAction && this.props.onAction() }); } }} style={{ width: this.getSize(307), height: this.getSize(40), alignItems: 'center', justifyContent: 'center', }}> {this.props.actionText} } } module.exports = DownloadDialog; ================================================ FILE: view/InputDialog.js ================================================ import React, { Component } from 'react'; import { View, Text, TouchableOpacity, TextInput, Keyboard } from 'react-native'; import BaseDialog from './BaseDialog'; import KeyboardSpacer from './KeyboardSpacer'; class InputDialog extends BaseDialog { static defaultProps = { removeSubviews: false, title: '我要举报', titleSize: 16, titleColor: '#333333', cancelText: '返回', cancelSize: 14, cancelColor: '#333333', btnText: '提交', btnTextSize: 12, btnTextColor: '#ffffff', btnBgColor: '#1097D5', placeholder: '请尽量说明问题,我们将尽快处理...', onSubmit: null } constructor(props) { super(props); } _getContentPosition() { return { justifyContent: 'flex-end', alignItems: 'center' } } show(text) { super.show(null, { text: text }); this.textInput.focus(); } dismiss(callback) { this.textInput.blur(); super.dismiss(callback); } renderContent() { return this.dismiss()} style={{ position: 'absolute', left: this.getSize(10), height: this.getSize(40), flexDirection: 'row', justifyContent: 'center', alignItems: 'center', marginLeft: this.getSize(5) }}> {this.props.cancelText} {this.props.title} this.textInput = ref} style={{ width: this.getSize(345), marginLeft: this.getSize(15), height: this.getSize(100), color: '#333333', fontSize: this.getSize(14), borderWidth: 1, borderColor: '#E8EEF0', backgroundColor: '#ffffff', borderRadius: this.getSize(4), paddingLeft: this.getSize(15), paddingRight: this.getSize(15), paddingTop: this.getSize(10) }} numberOfLines={4} multiline={true} value={this.state.text} underlineColorAndroid={'transparent'} placeholder={this.props.placeholder} placeholderTextColor='#999999' onChangeText={(text) => { this.inputText = text; }} /> this.dismiss(() => { this.props.onSubmit && this.props.onSubmit(this.inputText); })} style={{ width: this.getSize(60), height: this.getSize(28), justifyContent: 'center', alignItems: 'center', backgroundColor: this.props.btnBgColor, borderRadius: this.getSize(4) }}> {this.props.btnText} } } export default InputDialog; ================================================ FILE: view/KeyboardSpacer.js ================================================ /** * Created by andrewhurst on 10/5/15. */ import React, { Component } from 'react'; import { Keyboard, LayoutAnimation, View, Dimensions, Platform, StyleSheet } from 'react-native'; const styles = StyleSheet.create({ container: { left: 0, right: 0, bottom: 0, }, }); // From: https://medium.com/man-moon/writing-modern-react-native-ui-e317ff956f02 const defaultAnimation = { duration: 500, create: { duration: 300, type: LayoutAnimation.Types.easeInEaseOut, property: LayoutAnimation.Properties.opacity }, update: { type: LayoutAnimation.Types.spring, springDamping: 200 } }; export default class KeyboardSpacer extends Component { static defaultProps = { topSpacing: 0, onToggle: () => null, }; constructor(props, context) { super(props, context); this.state = { keyboardSpace: 0, isKeyboardOpened: false }; this._listeners = null; this.updateKeyboardSpace = this.updateKeyboardSpace.bind(this); this.resetKeyboardSpace = this.resetKeyboardSpace.bind(this); } componentDidMount() { const updateListener = Platform.OS === 'android' ? 'keyboardDidShow' : 'keyboardWillShow'; const resetListener = Platform.OS === 'android' ? 'keyboardDidHide' : 'keyboardWillHide'; this._listeners = [ Keyboard.addListener(updateListener, this.updateKeyboardSpace), Keyboard.addListener(resetListener, this.resetKeyboardSpace) ]; } componentWillUnmount() { this._listeners.forEach(listener => listener.remove()); } updateKeyboardSpace(event) { if (!event.endCoordinates) { return; } let animationConfig = defaultAnimation; if (Platform.OS === 'ios') { animationConfig = LayoutAnimation.create( event.duration, LayoutAnimation.Types[event.easing], LayoutAnimation.Properties.opacity, ); } LayoutAnimation.configureNext(animationConfig); // get updated on rotation const screenHeight = Dimensions.get('window').height; // when external physical keyboard is connected // event.endCoordinates.height still equals virtual keyboard height // however only the keyboard toolbar is showing if there should be one const keyboardSpace = (screenHeight - event.endCoordinates.screenY) + this.props.topSpacing; this.setState({ keyboardSpace, isKeyboardOpened: true }, this.props.onToggle(true, keyboardSpace)); } resetKeyboardSpace(event) { let animationConfig = defaultAnimation; if (Platform.OS === 'ios') { animationConfig = LayoutAnimation.create( event.duration, LayoutAnimation.Types[event.easing], LayoutAnimation.Properties.opacity, ); } LayoutAnimation.configureNext(animationConfig); this.setState({ keyboardSpace: 0, isKeyboardOpened: false }, this.props.onToggle(false, 0)); } render() { return ( ); } } ================================================ FILE: view/PickerView.js ================================================ import React, { Component } from 'react'; import { View, Animated, PanResponder } from 'react-native'; import BaseComponent from './BaseComponent'; import Svg, { LinearGradient, Rect, Stop } from 'react-native-svg'; class PickerView extends BaseComponent { static defaultProps = { itemTextColor: 0x333333ff, itemSelectedColor: 0x1097D5ff, itemHeight: 40, onPickerSelected: null, selectedIndex: 0 } _previousTop = 0; lastTop = 0; constructor(props) { super(props); list = ['', ''].concat(props.list).concat(['', '']); this.colorPath = []; let length = list.length; for (let i = 0; i < length; i++) { this.colorPath.push(new Animated.Value(i == (this.props.selectedIndex + 2) ? 1 : 0)); } this.path = new Animated.Value(-props.itemHeight * this.props.selectedIndex); this.state = { list: list, selectedIndex: props.selectedIndex, }; this.maxTop = 0; this.maxBottom = -props.itemHeight * (list.length - 5); this.onStartShouldSetPanResponder = this.onStartShouldSetPanResponder.bind(this); this.onMoveShouldSetPanResponder = this.onMoveShouldSetPanResponder.bind(this); this.onPanResponderGrant = this.onPanResponderGrant.bind(this); this.onPanResponderMove = this.onPanResponderMove.bind(this); this.onPanResponderEnd = this.onPanResponderEnd.bind(this); //這裏固定在屏幕底部,所以直接寫死touch區域即可。 this.parentTopY = this.mScreenHeight - props.itemHeight * 5 - this.getSize(15); this.parentBottomY = this.mScreenHeight - this.getSize(15); } shouldComponentUpdate(nextProps, nextState) { if (nextProps) { list = ['', ''].concat(nextProps.list).concat(['', '']); listChange = JSON.stringify(list) != JSON.stringify(this.state.list); indexChange = nextProps.selectedIndex != this.state.selectedIndex; if (listChange || indexChange) { console.log('shouldComponentUpdate'); this.path.setValue(-this.props.itemHeight * nextProps.selectedIndex); if (listChange) { this.colorPath = []; let length = list.length; for (let i = 0; i < length; i++) { this.colorPath.push(new Animated.Value(i == (nextProps.selectedIndex + 2) ? 1 : 0)); } } nextState.list = list; nextState.selectedIndex = nextProps.selectedIndex; this.maxTop = 0; this.maxBottom = -this.props.itemHeight * (list.length - 5); return true; } } return false; } //用户开始触摸屏幕的时候,是否愿意成为响应者; onStartShouldSetPanResponder(evt, gestureState) { if (evt.nativeEvent.pageY < this.parentTopY || evt.nativeEvent.pageY > this.parentBottomY) { return false; } else { this.path && this.path.removeAllListeners(); this.path.stopAnimation(); this.keyDown = Date.now(); return true; } } //在每一个触摸点开始移动的时候,再询问一次是否响应触摸交互; onMoveShouldSetPanResponder(evt, gestureState) { if (evt.nativeEvent.pageY < this.parentTopY || evt.nativeEvent.pageY > this.parentBottomY) { return false; } else { this.path && this.path.removeAllListeners(); this.path.stopAnimation(); return true; } } // 开始手势操作。给用户一些视觉反馈,让他们知道发生了什么事情! onPanResponderGrant(evt, gestureState) { this.lastTop = this.path._value; } // 最近一次的移动距离为gestureState.move{X,Y} onPanResponderMove(evt, gestureState) { if (global.timer != null) { global.timer.map(item => { clearTimeout(item); }); } this._previousTop = this.lastTop + gestureState.dy; if (this._previousTop > 0) { this._previousTop = Math.min(this._previousTop, this.maxTop + this.props.itemHeight); } else { this._previousTop = Math.max(this._previousTop, this.maxBottom - this.props.itemHeight); } this.path.setValue(this._previousTop); if (this.previousTop) { this.velocity = gestureState.dy - this.previousTop; } else { this.velocity = 0; } this.previousTop = gestureState.dy; } lastEvent = null; lastTwoEvent = null; onPanResponderEnd(evt, gestureState) { let actionTime = Date.now() - this.keyDown; if (actionTime < 300 && Math.abs(gestureState.vy) < 0.1) { let clickPosition = -(parseInt((gestureState.y0 - this.parentTopY) / this.props.itemHeight) - 2); let toValue = this.path._value; let number = Math.round(toValue / this.props.itemHeight); toValue = this.props.itemHeight * number; toValue = toValue + (this.props.itemHeight * clickPosition); if (toValue > 0) { toValue = Math.min(toValue, this.maxTop); } else { toValue = Math.max(toValue, this.maxBottom); } if (isNaN(toValue)) { } else { //onSeleted Animated.timing(this.path, { toValue: toValue, duration: 200 }).start(() => { this.onSeleted(Math.abs(toValue / this.props.itemHeight - 2)); }); } } else { this.lastTop = this._previousTop; let toValue = this._previousTop + gestureState.vy * this.props.itemHeight * 2; let number = Math.round(toValue / this.props.itemHeight); toValue = this.props.itemHeight * number; if (toValue > 0) { toValue = Math.min(toValue, this.maxTop); } else { toValue = Math.max(toValue, this.maxBottom); } Animated.decay(this.path, { velocity: gestureState.vy, //通过手势设置相关速度 deceleration: 0.995, }).start(() => { if (this.path._value % this.props.itemHeight == 0) { this.path.removeListener(this.pathListener); this.pathListener = null; } else { //慣性動畫 if (this.pathListener) { this.path.removeListener(this.pathListener); this.pathListener = null; let toValue = Math.round(this.path._value / this.props.itemHeight) * this.props.itemHeight; Animated.timing(this.path, { toValue: toValue, duration: 50 }).start(() => { //onSeleted this.onSeleted(Math.abs(toValue / this.props.itemHeight - 2)); }); } } }); //當滾動超出上限或者下限時,接管慣性動畫 this.pathListener = this.path.addListener((listener) => { if (listener.value < this.maxBottom && this.pathListener) { this.path.removeListener(this.pathListener); this.pathListener = null; Animated.timing(this.path, { toValue: this.maxBottom }).start(() => { //onSeleted this.onSeleted(Math.abs(this.maxBottom / this.props.itemHeight - 2)); }); } else if (listener.value > this.maxTop - this.props.itemHeight && this.pathListener) { this.path.removeListener(this.pathListener); this.pathListener = null; Animated.timing(this.path, { toValue: this.maxTop }).start(() => { //onSeleted this.onSeleted(Math.abs(this.maxTop / this.props.itemHeight - 2)); }); } }); } } onSeleted(selectedIndex) { if (global.timer == null) { global.timer = []; } global.timer.push(setTimeout(() => { this.colorPath.map((item, index) => { if (item._value == 0 && selectedIndex == index) { item.setValue(1); } else if (item._value == 1 && selectedIndex != index) { item.setValue(0); } }) this.props.onPickerSelected && this.props.onPickerSelected(this.state.list[selectedIndex]); }, 20)); } componentWillMount(evt, gestureState) { this._panResponder = PanResponder.create({ onStartShouldSetPanResponder: this.onStartShouldSetPanResponder, onMoveShouldSetPanResponder: this.onMoveShouldSetPanResponder, onPanResponderGrant: this.onPanResponderGrant, onPanResponderMove: this.onPanResponderMove, onPanResponderRelease: this.onPanResponderEnd, onPanResponderTerminate: this.onPanResponderEnd, }); } renderList() { return this.state.list.map((item, index) => { return this.renderItem(item, index); }); } renderItem(item, index) { return {item} } render() { return this.ref = ref} {...this._panResponder.panHandlers} style={{ overflow: 'hidden', width: this.props.itemWidth, height: this.props.itemHeight * 5 + this.getSize(15), backgroundColor: '#ffffff' }}> {this.renderList()} { return false; }} onResponderStart={() => { return false; }} style={{ position: 'absolute', top: 0 }} height={this.props.itemHeight * 1} width={this.props.itemWidth} > { return false; }} onResponderStart={() => { return false; }} style={{ position: 'absolute', bottom: this.getSize(15) }} height={this.props.itemHeight * 1} width={this.props.itemWidth} > } } export default PickerView; ================================================ FILE: view/SimpleChooseDialog.js ================================================ import React, { Component } from 'react'; import { View, Text, Animated, TouchableOpacity, FlatList } from 'react-native'; import BaseDialog from './BaseDialog'; /** * 用于不跳转页面的选择 */ class SimpleChooseDialog extends BaseDialog { static defaultProps = { items: ['a', 'b', 'c'], itemKey: 'key', itemStyle: { fontSize: 14, fontWeight: '400', color: '#333333' }, selectColor: '#1097D5', normalColor: '#666666', pointSize: 18, pointBorderRadius: 9, confirmText: '确定', confirmBtnColor: '#1097D5', confirmTextColor: '#ffffff', onPress: null, } constructor(props) { super(props); } renderItems() { return this.props.items.map((item, index) => { return { this.setState({ seleted: index }) }} key={this.key ? item[this.key] : item} style={{ paddingLeft: this.getSize(20), paddingRight: this.getSize(20), width: this.getSize(307), height: this.getSize(49), justifyContent: 'flex-start', alignItems: 'center', flexDirection: 'row' }}> {this.state.seleted == index ? : null} {typeof item == 'string' ? item : item[this.props.itemKey]} }) } _getContentPosition() { return { justifyContent: 'center', alignItems: 'center' } } renderContent() { return {this.renderItems()} { this.dismiss(() => { if (this.props.onPress) { this.props.onPress(this.state.seleted != null ? this.state.seleted : -1); } }); }} style={{ width: this.getSize(200), height: this.getSize(44), backgroundColor: this.props.confirmBtnColor, borderRadius: this.getSize(5), justifyContent: 'center', alignItems: 'center', marginTop: this.getSize(13), marginBottom: this.getSize(20) }}> {this.props.confirmText} } } export default SimpleChooseDialog; ================================================ FILE: view/SimpleItemsDialog.js ================================================ import React, { Component } from 'react'; import { View, Text, Animated, TouchableOpacity, FlatList } from 'react-native'; import BaseDialog from './BaseDialog'; class SimpleItemsDialog extends BaseDialog { static defaultProps = { items: ['a', 'b', 'c'], itemKey: 'key', itemStyle: { fontSize: 14, fontWeight: '400', color: '#333333' }, cancel: true, cancelText: '取消', cancelTextStyle: { fontSize: 14, fontWeight: '400', color: '#999999' }, onPress: null, } constructor(props) { super(props); } _getContentPosition() { return { justifyContent: 'flex-end', alignItems: 'center' } } renderItems() { return this.props.items.map((item, index) => { return { this.dismiss(() => { if (this.props.onPress) { this.props.onPress(index); } }); }} key={index} style={{ width: this.mScreenWidth, height: this.getSize(49), justifyContent: 'center', alignItems: 'center' }}> {typeof item == 'string' ? item : item[this.props.itemKey]} }) } renderCancel() { return this.dismiss()} style={{ width: this.mScreenWidth, height: this.getSize(49), justifyContent: 'center', alignItems: 'center' }}> {this.props.cancelText} } renderContent() { return {this.renderItems()} {this.props.cancel ? this.renderCancel() : null} } } export default SimpleItemsDialog; ================================================ FILE: view/ToastComponent.js ================================================ import React, { Component } from 'react'; import { View, Text, Animated } from 'react-native'; import BaseComponent from '../view/BaseComponent'; export default class ToastComponent extends BaseComponent { static defaultProps = { duration: 1500, textColor: '#ffffff', fontSize: 14, lineHeight: 20, paddingH: 10, paddingV: 5, borderRadius: 5, backgroundColor: 0x00000099, } opacity = new Animated.Value(0); leftPath = new Animated.Value(0); constructor(props) { super(props); this.state = { toastVisiable: false, toastText: '' } } show(message) { this.timeoutId && clearTimeout(this.timeoutId); this.opacity.setValue(0) this.setState({ toastText: message, toastVisiable: true }); Animated.timing(this.opacity, { toValue: 1, duration: 200 }).start(); this.timeoutId = setTimeout(() => { Animated.timing(this.opacity, { toValue: 0, duration: 200 }).start(() => { this.setState({ toastVisiable: false }); }); }, this.props.duration); } componentWillUnmount() { this.timeoutId && clearTimeout(this.timeoutId); } render() { if (this.state.toastVisiable) { return { //如果依靠父容器来定位Toast居中, //在配合react-navigation设置全局单例Toast,会导致StackNavigator布局异常 this.leftPath.setValue((this.mScreenWidth - e.nativeEvent.layout.width) / 2); }} style={{ opacity: this.opacity, alignItems: 'center', position: 'absolute', top: this.mScreenHeight - this.getSize(300), left: this.leftPath }}> {this.state.toastText} } else { return null; } } }