mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-27 19:25:11 +08:00
Removed deprecated RCT_EXPORT + code paths
This commit is contained in:
@@ -244,30 +244,19 @@ static NSArray *RCTBridgeModuleClassesByModuleID(void)
|
||||
|
||||
@implementation RCTModuleMethod
|
||||
{
|
||||
BOOL _isClassMethod;
|
||||
Class _moduleClass;
|
||||
SEL _selector;
|
||||
NSMethodSignature *_methodSignature;
|
||||
NSArray *_argumentBlocks;
|
||||
NSString *_methodName;
|
||||
dispatch_block_t _methodQueue;
|
||||
}
|
||||
|
||||
static NSString *RCTStringUpToFirstArgument(NSString *methodName)
|
||||
{
|
||||
NSRange colonRange = [methodName rangeOfString:@":"];
|
||||
if (colonRange.length) {
|
||||
methodName = [methodName substringToIndex:colonRange.location];
|
||||
}
|
||||
return methodName;
|
||||
}
|
||||
|
||||
- (instancetype)initWithReactMethodName:(NSString *)reactMethodName
|
||||
objCMethodName:(NSString *)objCMethodName
|
||||
JSMethodName:(NSString *)JSMethodName
|
||||
{
|
||||
if ((self = [super init])) {
|
||||
_methodName = reactMethodName;
|
||||
|
||||
NSArray *parts = [[reactMethodName substringWithRange:(NSRange){2, reactMethodName.length - 3}] componentsSeparatedByString:@" "];
|
||||
|
||||
// Parse class and method
|
||||
@@ -277,36 +266,33 @@ static NSString *RCTStringUpToFirstArgument(NSString *methodName)
|
||||
_moduleClassName = [_moduleClassName substringToIndex:categoryRange.location];
|
||||
}
|
||||
|
||||
NSArray *argumentNames = nil;
|
||||
if ([parts[1] hasPrefix:@"__rct_export__"]) {
|
||||
// New format
|
||||
NSString *selectorString = [parts[1] substringFromIndex:14];
|
||||
_selector = NSSelectorFromString(selectorString);
|
||||
_JSMethodName = JSMethodName ?: RCTStringUpToFirstArgument(selectorString);
|
||||
|
||||
static NSRegularExpression *regExp;
|
||||
if (!regExp) {
|
||||
NSString *unusedPattern = @"(?:(?:__unused|__attribute__\\(\\(unused\\)\\)))";
|
||||
NSString *constPattern = @"(?:const)";
|
||||
NSString *constUnusedPattern = [NSString stringWithFormat:@"(?:(?:%@|%@)\\s*)", unusedPattern, constPattern];
|
||||
NSString *pattern = [NSString stringWithFormat:@"\\(%1$@?(\\w+?)(?:\\s*\\*)?%1$@?\\)", constUnusedPattern];
|
||||
regExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:NULL];
|
||||
NSString *selectorString = [parts[1] substringFromIndex:14];
|
||||
_selector = NSSelectorFromString(selectorString);
|
||||
_JSMethodName = JSMethodName ?: ({
|
||||
NSString *methodName = selectorString;
|
||||
NSRange colonRange = [methodName rangeOfString:@":"];
|
||||
if (colonRange.length) {
|
||||
methodName = [methodName substringToIndex:colonRange.location];
|
||||
}
|
||||
methodName;
|
||||
});
|
||||
|
||||
argumentNames = [NSMutableArray array];
|
||||
[regExp enumerateMatchesInString:objCMethodName options:0 range:NSMakeRange(0, objCMethodName.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
|
||||
NSString *argumentName = [objCMethodName substringWithRange:[result rangeAtIndex:1]];
|
||||
[(NSMutableArray *)argumentNames addObject:argumentName];
|
||||
}];
|
||||
} else {
|
||||
// Old format
|
||||
NSString *selectorString = parts[1];
|
||||
_selector = NSSelectorFromString(selectorString);
|
||||
_JSMethodName = JSMethodName ?: RCTStringUpToFirstArgument(selectorString);
|
||||
static NSRegularExpression *regExp;
|
||||
if (!regExp) {
|
||||
NSString *unusedPattern = @"(?:(?:__unused|__attribute__\\(\\(unused\\)\\)))";
|
||||
NSString *constPattern = @"(?:const)";
|
||||
NSString *constUnusedPattern = [NSString stringWithFormat:@"(?:(?:%@|%@)\\s*)", unusedPattern, constPattern];
|
||||
NSString *pattern = [NSString stringWithFormat:@"\\(%1$@?(\\w+?)(?:\\s*\\*)?%1$@?\\)", constUnusedPattern];
|
||||
regExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:NULL];
|
||||
}
|
||||
|
||||
NSMutableArray *argumentNames = [NSMutableArray array];
|
||||
[regExp enumerateMatchesInString:objCMethodName options:0 range:NSMakeRange(0, objCMethodName.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
|
||||
NSString *argumentName = [objCMethodName substringWithRange:[result rangeAtIndex:1]];
|
||||
[argumentNames addObject:argumentName];
|
||||
}];
|
||||
|
||||
// Extract class and method details
|
||||
_isClassMethod = [reactMethodName characterAtIndex:0] == '+';
|
||||
_moduleClass = NSClassFromString(_moduleClassName);
|
||||
|
||||
if (RCT_DEBUG) {
|
||||
@@ -318,9 +304,7 @@ static NSString *RCTStringUpToFirstArgument(NSString *methodName)
|
||||
}
|
||||
|
||||
// Get method signature
|
||||
_methodSignature = _isClassMethod ?
|
||||
[_moduleClass methodSignatureForSelector:_selector] :
|
||||
[_moduleClass instanceMethodSignatureForSelector:_selector];
|
||||
_methodSignature = [_moduleClass instanceMethodSignatureForSelector:_selector];
|
||||
|
||||
// Process arguments
|
||||
NSUInteger numberOfArguments = _methodSignature.numberOfArguments;
|
||||
@@ -363,119 +347,64 @@ static NSString *RCTStringUpToFirstArgument(NSString *methodName)
|
||||
for (NSUInteger i = 2; i < numberOfArguments; i++) {
|
||||
const char *argumentType = [_methodSignature getArgumentTypeAtIndex:i];
|
||||
|
||||
BOOL useFallback = YES;
|
||||
if (argumentNames) {
|
||||
NSString *argumentName = argumentNames[i - 2];
|
||||
SEL selector = NSSelectorFromString([argumentName stringByAppendingString:@":"]);
|
||||
if ([RCTConvert respondsToSelector:selector]) {
|
||||
useFallback = NO;
|
||||
switch (argumentType[0]) {
|
||||
|
||||
#define RCT_CONVERT_CASE(_value, _type) \
|
||||
case _value: { \
|
||||
_type (*convert)(id, SEL, id) = (typeof(convert))objc_msgSend; \
|
||||
RCT_ARG_BLOCK( _type value = convert([RCTConvert class], selector, json); ) \
|
||||
break; \
|
||||
}
|
||||
|
||||
RCT_CONVERT_CASE(':', SEL)
|
||||
RCT_CONVERT_CASE('*', const char *)
|
||||
RCT_CONVERT_CASE('c', char)
|
||||
RCT_CONVERT_CASE('C', unsigned char)
|
||||
RCT_CONVERT_CASE('s', short)
|
||||
RCT_CONVERT_CASE('S', unsigned short)
|
||||
RCT_CONVERT_CASE('i', int)
|
||||
RCT_CONVERT_CASE('I', unsigned int)
|
||||
RCT_CONVERT_CASE('l', long)
|
||||
RCT_CONVERT_CASE('L', unsigned long)
|
||||
RCT_CONVERT_CASE('q', long long)
|
||||
RCT_CONVERT_CASE('Q', unsigned long long)
|
||||
RCT_CONVERT_CASE('f', float)
|
||||
RCT_CONVERT_CASE('d', double)
|
||||
RCT_CONVERT_CASE('B', BOOL)
|
||||
RCT_CONVERT_CASE('@', id)
|
||||
RCT_CONVERT_CASE('^', void *)
|
||||
|
||||
case '{': {
|
||||
[argumentBlocks addObject:^(RCTBridge *bridge, NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) {
|
||||
NSMethodSignature *methodSignature = [RCTConvert methodSignatureForSelector:selector];
|
||||
void *returnValue = malloc(methodSignature.methodReturnLength);
|
||||
NSInvocation *_invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
|
||||
[_invocation setTarget:[RCTConvert class]];
|
||||
[_invocation setSelector:selector];
|
||||
[_invocation setArgument:&json atIndex:2];
|
||||
[_invocation invoke];
|
||||
[_invocation getReturnValue:returnValue];
|
||||
|
||||
[invocation setArgument:returnValue atIndex:index];
|
||||
|
||||
free(returnValue);
|
||||
}];
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
defaultCase(argumentType);
|
||||
}
|
||||
} else if ([argumentName isEqualToString:@"RCTResponseSenderBlock"]) {
|
||||
addBlockArgument();
|
||||
useFallback = NO;
|
||||
}
|
||||
}
|
||||
|
||||
if (useFallback) {
|
||||
NSString *argumentName = argumentNames[i - 2];
|
||||
SEL selector = NSSelectorFromString([argumentName stringByAppendingString:@":"]);
|
||||
if ([RCTConvert respondsToSelector:selector]) {
|
||||
switch (argumentType[0]) {
|
||||
|
||||
#define RCT_CASE(_value, _class, _logic) \
|
||||
case _value: { \
|
||||
RCT_ARG_BLOCK( \
|
||||
if (RCT_DEBUG && json && ![json isKindOfClass:[_class class]]) { \
|
||||
RCTLogError(@"Argument %tu (%@) of %@.%@ should be of type %@", index, \
|
||||
json, RCTBridgeModuleNameForClass(_moduleClass), _JSMethodName, [_class class]); \
|
||||
return; \
|
||||
} \
|
||||
_logic \
|
||||
) \
|
||||
break; \
|
||||
}
|
||||
#define RCT_CONVERT_CASE(_value, _type) \
|
||||
case _value: { \
|
||||
_type (*convert)(id, SEL, id) = (typeof(convert))objc_msgSend; \
|
||||
RCT_ARG_BLOCK( _type value = convert([RCTConvert class], selector, json); ) \
|
||||
break; \
|
||||
}
|
||||
|
||||
RCT_CASE(':', NSString, SEL value = NSSelectorFromString(json); )
|
||||
RCT_CASE('*', NSString, const char *value = [json UTF8String]; )
|
||||
RCT_CONVERT_CASE(':', SEL)
|
||||
RCT_CONVERT_CASE('*', const char *)
|
||||
RCT_CONVERT_CASE('c', char)
|
||||
RCT_CONVERT_CASE('C', unsigned char)
|
||||
RCT_CONVERT_CASE('s', short)
|
||||
RCT_CONVERT_CASE('S', unsigned short)
|
||||
RCT_CONVERT_CASE('i', int)
|
||||
RCT_CONVERT_CASE('I', unsigned int)
|
||||
RCT_CONVERT_CASE('l', long)
|
||||
RCT_CONVERT_CASE('L', unsigned long)
|
||||
RCT_CONVERT_CASE('q', long long)
|
||||
RCT_CONVERT_CASE('Q', unsigned long long)
|
||||
RCT_CONVERT_CASE('f', float)
|
||||
RCT_CONVERT_CASE('d', double)
|
||||
RCT_CONVERT_CASE('B', BOOL)
|
||||
RCT_CONVERT_CASE('@', id)
|
||||
RCT_CONVERT_CASE('^', void *)
|
||||
|
||||
#define RCT_SIMPLE_CASE(_value, _type, _selector) \
|
||||
case _value: { \
|
||||
RCT_ARG_BLOCK( \
|
||||
if (RCT_DEBUG && json && ![json respondsToSelector:@selector(_selector)]) { \
|
||||
RCTLogError(@"Argument %tu (%@) of %@.%@ does not respond to selector: %@", \
|
||||
index, json, RCTBridgeModuleNameForClass(_moduleClass), _JSMethodName, @#_selector); \
|
||||
return; \
|
||||
} \
|
||||
_type value = [json _selector]; \
|
||||
) \
|
||||
break; \
|
||||
}
|
||||
case '{': {
|
||||
[argumentBlocks addObject:^(RCTBridge *bridge, NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) {
|
||||
NSMethodSignature *methodSignature = [RCTConvert methodSignatureForSelector:selector];
|
||||
void *returnValue = malloc(methodSignature.methodReturnLength);
|
||||
NSInvocation *_invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
|
||||
[_invocation setTarget:[RCTConvert class]];
|
||||
[_invocation setSelector:selector];
|
||||
[_invocation setArgument:&json atIndex:2];
|
||||
[_invocation invoke];
|
||||
[_invocation getReturnValue:returnValue];
|
||||
|
||||
RCT_SIMPLE_CASE('c', char, charValue)
|
||||
RCT_SIMPLE_CASE('C', unsigned char, unsignedCharValue)
|
||||
RCT_SIMPLE_CASE('s', short, shortValue)
|
||||
RCT_SIMPLE_CASE('S', unsigned short, unsignedShortValue)
|
||||
RCT_SIMPLE_CASE('i', int, intValue)
|
||||
RCT_SIMPLE_CASE('I', unsigned int, unsignedIntValue)
|
||||
RCT_SIMPLE_CASE('l', long, longValue)
|
||||
RCT_SIMPLE_CASE('L', unsigned long, unsignedLongValue)
|
||||
RCT_SIMPLE_CASE('q', long long, longLongValue)
|
||||
RCT_SIMPLE_CASE('Q', unsigned long long, unsignedLongLongValue)
|
||||
RCT_SIMPLE_CASE('f', float, floatValue)
|
||||
RCT_SIMPLE_CASE('d', double, doubleValue)
|
||||
RCT_SIMPLE_CASE('B', BOOL, boolValue)
|
||||
[invocation setArgument:returnValue atIndex:index];
|
||||
|
||||
case '{':
|
||||
RCTLogMustFix(@"Cannot convert JSON to struct %s", argumentType);
|
||||
break;
|
||||
free(returnValue);
|
||||
}];
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
defaultCase(argumentType);
|
||||
}
|
||||
} else if ([argumentName isEqualToString:@"RCTResponseSenderBlock"]) {
|
||||
addBlockArgument();
|
||||
} else {
|
||||
|
||||
// Unknown argument type
|
||||
RCTLogError(@"Unknown argument type '%@' in method %@. Extend RCTConvert"
|
||||
" to support this type.", argumentName, [self methodName]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,7 +423,7 @@ static NSString *RCTStringUpToFirstArgument(NSString *methodName)
|
||||
|
||||
// Sanity check
|
||||
RCTAssert([module class] == _moduleClass, @"Attempted to invoke method \
|
||||
%@ on a module of class %@", _methodName, [module class]);
|
||||
%@ on a module of class %@", [self methodName], [module class]);
|
||||
|
||||
// Safety check
|
||||
if (arguments.count != _argumentBlocks.count) {
|
||||
@@ -520,12 +449,19 @@ static NSString *RCTStringUpToFirstArgument(NSString *methodName)
|
||||
}
|
||||
|
||||
// Invoke method
|
||||
[invocation invokeWithTarget:_isClassMethod ? [module class] : module];
|
||||
[invocation invokeWithTarget:module];
|
||||
}
|
||||
|
||||
- (NSString *)methodName
|
||||
{
|
||||
return [NSString stringWithFormat:@"-[%@ %@]", _moduleClass,
|
||||
NSStringFromSelector(_selector)];
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
return [NSString stringWithFormat:@"<%@: %p; exports %@ as %@;>", NSStringFromClass(self.class), self, _methodName, _JSMethodName];
|
||||
return [NSString stringWithFormat:@"<%@: %p; exports %@ as %@();>",
|
||||
[self class], self, [self methodName], _JSMethodName];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -562,19 +498,10 @@ static RCTSparseArray *RCTExportedMethodsByModuleID(void)
|
||||
const char **entries = (const char **)(mach_header + addr);
|
||||
|
||||
// Create method
|
||||
RCTModuleMethod *moduleMethod;
|
||||
if (entries[2] == NULL) {
|
||||
|
||||
// Legacy support for RCT_EXPORT()
|
||||
moduleMethod = [[RCTModuleMethod alloc] initWithReactMethodName:@(entries[0])
|
||||
objCMethodName:@(entries[0])
|
||||
JSMethodName:strlen(entries[1]) ? @(entries[1]) : nil];
|
||||
} else {
|
||||
moduleMethod = [[RCTModuleMethod alloc] initWithReactMethodName:@(entries[0])
|
||||
objCMethodName:strlen(entries[1]) ? @(entries[1]) : nil
|
||||
JSMethodName:strlen(entries[2]) ? @(entries[2]) : nil];
|
||||
}
|
||||
|
||||
RCTModuleMethod *moduleMethod =
|
||||
[[RCTModuleMethod alloc] initWithReactMethodName:@(entries[0])
|
||||
objCMethodName:@(entries[1])
|
||||
JSMethodName:strlen(entries[2]) ? @(entries[2]) : nil];
|
||||
// Cache method
|
||||
NSArray *methods = methodsByModuleClassName[moduleMethod.moduleClassName];
|
||||
methodsByModuleClassName[moduleMethod.moduleClassName] =
|
||||
@@ -726,7 +653,7 @@ static NSDictionary *RCTLocalModulesConfig()
|
||||
@"methodID": @(methods.count),
|
||||
@"type": @"local"
|
||||
};
|
||||
[RCTLocalMethodNames addObject:methodName];
|
||||
[RCTLocalMethodNames addObject:methodName];
|
||||
}
|
||||
|
||||
// Add module and method lookup
|
||||
@@ -1610,7 +1537,7 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin
|
||||
|
||||
- (void)stopProfiling
|
||||
{
|
||||
RCTAssertMainThread();
|
||||
RCTAssertMainThread();
|
||||
|
||||
[_javaScriptExecutor executeBlockOnJavaScriptQueue:^{
|
||||
NSString *log = RCTProfileEnd(self);
|
||||
|
||||
@@ -145,15 +145,6 @@ extern const dispatch_queue_t RCTJSThread;
|
||||
static const char *__rct_export_entry__[] = { __func__, #method, #js_name }; \
|
||||
}
|
||||
|
||||
/**
|
||||
* Deprecated, do not use.
|
||||
*/
|
||||
#define RCT_EXPORT(js_name) \
|
||||
_Pragma("message(\"RCT_EXPORT is deprecated. Use RCT_EXPORT_METHOD instead.\")") \
|
||||
__attribute__((used, section("__DATA,RCTExport"))) \
|
||||
__attribute__((__aligned__(1))) \
|
||||
static const char *__rct_export_entry__[] = { __func__, #js_name, NULL }
|
||||
|
||||
/**
|
||||
* The queue that will be used to call all exported methods. If omitted, this
|
||||
* will call on the default background queue, which is avoids blocking the main
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
*/
|
||||
@interface RCTConvert : NSObject
|
||||
|
||||
+ (id)id:(id)json;
|
||||
|
||||
+ (BOOL)BOOL:(id)json;
|
||||
+ (double)double:(id)json;
|
||||
+ (float)float:(id)json;
|
||||
@@ -52,7 +54,6 @@
|
||||
+ (NSWritingDirection)NSWritingDirection:(id)json;
|
||||
+ (UITextAutocapitalizationType)UITextAutocapitalizationType:(id)json;
|
||||
+ (UITextFieldViewMode)UITextFieldViewMode:(id)json;
|
||||
+ (UIScrollViewKeyboardDismissMode)UIScrollViewKeyboardDismissMode:(id)json;
|
||||
+ (UIKeyboardType)UIKeyboardType:(id)json;
|
||||
+ (UIReturnKeyType)UIReturnKeyType:(id)json;
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ void RCTLogConvertError(id json, const char *type)
|
||||
json, [json classForCoder], type);
|
||||
}
|
||||
|
||||
RCT_CONVERTER(id, id, self)
|
||||
|
||||
RCT_CONVERTER(BOOL, BOOL, boolValue)
|
||||
RCT_NUMBER_CONVERTER(double, doubleValue)
|
||||
RCT_NUMBER_CONVERTER(float, floatValue)
|
||||
@@ -219,12 +221,6 @@ RCT_ENUM_CONVERTER(UITextFieldViewMode, (@{
|
||||
@"always": @(UITextFieldViewModeAlways),
|
||||
}), UITextFieldViewModeNever, integerValue)
|
||||
|
||||
RCT_ENUM_CONVERTER(UIScrollViewKeyboardDismissMode, (@{
|
||||
@"none": @(UIScrollViewKeyboardDismissModeNone),
|
||||
@"on-drag": @(UIScrollViewKeyboardDismissModeOnDrag),
|
||||
@"interactive": @(UIScrollViewKeyboardDismissModeInteractive),
|
||||
}), UIScrollViewKeyboardDismissModeNone, integerValue)
|
||||
|
||||
RCT_ENUM_CONVERTER(UIKeyboardType, (@{
|
||||
@"default": @(UIKeyboardTypeDefault),
|
||||
@"ascii-capable": @(UIKeyboardTypeASCIICapable),
|
||||
@@ -237,6 +233,8 @@ RCT_ENUM_CONVERTER(UIKeyboardType, (@{
|
||||
@"decimal-pad": @(UIKeyboardTypeDecimalPad),
|
||||
@"twitter": @(UIKeyboardTypeTwitter),
|
||||
@"web-search": @(UIKeyboardTypeWebSearch),
|
||||
// Added for Android compatibility
|
||||
@"numeric": @(UIKeyboardTypeDecimalPad),
|
||||
}), UIKeyboardTypeDefault, integerValue)
|
||||
|
||||
RCT_ENUM_CONVERTER(UIReturnKeyType, (@{
|
||||
@@ -267,7 +265,11 @@ RCT_ENUM_CONVERTER(UIViewContentMode, (@{
|
||||
@"top-right": @(UIViewContentModeTopRight),
|
||||
@"bottom-left": @(UIViewContentModeBottomLeft),
|
||||
@"bottom-right": @(UIViewContentModeBottomRight),
|
||||
}), UIViewContentModeScaleToFill, integerValue)
|
||||
// Cross-platform values
|
||||
@"cover": @(UIViewContentModeScaleAspectFill),
|
||||
@"contain": @(UIViewContentModeScaleAspectFit),
|
||||
@"stretch": @(UIViewContentModeScaleToFill),
|
||||
}), UIViewContentModeScaleAspectFill, integerValue)
|
||||
|
||||
RCT_ENUM_CONVERTER(UIBarStyle, (@{
|
||||
@"default": @(UIBarStyleDefault),
|
||||
|
||||
@@ -85,11 +85,6 @@
|
||||
selector:@selector(dismiss)
|
||||
name:RCTReloadNotification
|
||||
object:nil];
|
||||
|
||||
[notificationCenter addObserver:self
|
||||
selector:@selector(dismiss)
|
||||
name:RCTJavaScriptDidLoadNotification
|
||||
object:nil];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,14 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import "RCTBridgeModule.h"
|
||||
#import "RCTConvert.h"
|
||||
|
||||
@interface RCTConvert (UIStatusBar)
|
||||
|
||||
+ (UIStatusBarStyle)UIStatusBarStyle:(id)json;
|
||||
+ (UIStatusBarAnimation)UIStatusBarAnimation:(id)json;
|
||||
|
||||
@end
|
||||
|
||||
@interface RCTStatusBarManager : NSObject <RCTBridgeModule>
|
||||
|
||||
|
||||
@@ -11,6 +11,21 @@
|
||||
|
||||
#import "RCTLog.h"
|
||||
|
||||
@implementation RCTConvert (UIStatusBar)
|
||||
|
||||
RCT_ENUM_CONVERTER(UIStatusBarStyle, (@{
|
||||
@"default": @(UIStatusBarStyleDefault),
|
||||
@"light-content": @(UIStatusBarStyleLightContent),
|
||||
}), UIStatusBarStyleDefault, integerValue);
|
||||
|
||||
RCT_ENUM_CONVERTER(UIStatusBarAnimation, (@{
|
||||
@"none": @(UIStatusBarAnimationNone),
|
||||
@"fade": @(UIStatusBarAnimationFade),
|
||||
@"slide": @(UIStatusBarAnimationSlide),
|
||||
}), UIStatusBarAnimationNone, integerValue);
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTStatusBarManager
|
||||
|
||||
static BOOL RCTViewControllerBasedStatusBarAppearance()
|
||||
@@ -18,7 +33,8 @@ static BOOL RCTViewControllerBasedStatusBarAppearance()
|
||||
static BOOL value;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
value = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"] ?: @YES boolValue];
|
||||
value = [[[NSBundle mainBundle] objectForInfoDictionaryKey:
|
||||
@"UIViewControllerBasedStatusBarAppearance"] ?: @YES boolValue];
|
||||
});
|
||||
|
||||
return value;
|
||||
@@ -55,19 +71,4 @@ RCT_EXPORT_METHOD(setHidden:(BOOL)hidden
|
||||
}
|
||||
}
|
||||
|
||||
- (NSDictionary *)constantsToExport
|
||||
{
|
||||
return @{
|
||||
@"Style": @{
|
||||
@"default": @(UIStatusBarStyleDefault),
|
||||
@"lightContent": @(UIStatusBarStyleLightContent),
|
||||
},
|
||||
@"Animation": @{
|
||||
@"none": @(UIStatusBarAnimationNone),
|
||||
@"fade": @(UIStatusBarAnimationFade),
|
||||
@"slide": @(UIStatusBarAnimationSlide),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1397,11 +1397,6 @@ RCT_EXPORT_METHOD(clearJSResponder)
|
||||
NSMutableDictionary *allJSConstants = [@{
|
||||
@"customBubblingEventTypes": [self customBubblingEventTypes],
|
||||
@"customDirectEventTypes": [self customDirectEventTypes],
|
||||
@"NSTextAlignment": @{
|
||||
@"Left": @(NSTextAlignmentLeft),
|
||||
@"Center": @(NSTextAlignmentCenter),
|
||||
@"Right": @(NSTextAlignmentRight),
|
||||
},
|
||||
@"Dimensions": @{
|
||||
@"window": @{
|
||||
@"width": @(RCTScreenSize().width),
|
||||
@@ -1413,73 +1408,6 @@ RCT_EXPORT_METHOD(clearJSResponder)
|
||||
@"height": @(RCTScreenSize().height),
|
||||
},
|
||||
},
|
||||
@"StyleConstants": @{
|
||||
@"PointerEventsValues": @{
|
||||
@"none": @(RCTPointerEventsNone),
|
||||
@"box-none": @(RCTPointerEventsBoxNone),
|
||||
@"box-only": @(RCTPointerEventsBoxOnly),
|
||||
@"auto": @(RCTPointerEventsUnspecified),
|
||||
},
|
||||
},
|
||||
@"UIText": @{
|
||||
@"AutocapitalizationType": @{
|
||||
@"characters": @(UITextAutocapitalizationTypeAllCharacters),
|
||||
@"sentences": @(UITextAutocapitalizationTypeSentences),
|
||||
@"words": @(UITextAutocapitalizationTypeWords),
|
||||
@"none": @(UITextAutocapitalizationTypeNone),
|
||||
},
|
||||
},
|
||||
@"UITextField": @{
|
||||
@"clearButtonMode": @{
|
||||
@"never": @(UITextFieldViewModeNever),
|
||||
@"while-editing": @(UITextFieldViewModeWhileEditing),
|
||||
@"unless-editing": @(UITextFieldViewModeUnlessEditing),
|
||||
@"always": @(UITextFieldViewModeAlways),
|
||||
},
|
||||
},
|
||||
@"UIKeyboardType": @{
|
||||
@"default": @(UIKeyboardTypeDefault),
|
||||
@"ascii-capable": @(UIKeyboardTypeASCIICapable),
|
||||
@"numbers-and-punctuation": @(UIKeyboardTypeNumbersAndPunctuation),
|
||||
@"url": @(UIKeyboardTypeURL),
|
||||
@"number-pad": @(UIKeyboardTypeNumberPad),
|
||||
@"phone-pad": @(UIKeyboardTypePhonePad),
|
||||
@"name-phone-pad": @(UIKeyboardTypeNamePhonePad),
|
||||
@"decimal-pad": @(UIKeyboardTypeDecimalPad),
|
||||
@"email-address": @(UIKeyboardTypeEmailAddress),
|
||||
@"twitter": @(UIKeyboardTypeTwitter),
|
||||
@"web-search": @(UIKeyboardTypeWebSearch),
|
||||
},
|
||||
@"UIReturnKeyType": @{
|
||||
@"default": @(UIReturnKeyDefault),
|
||||
@"go": @(UIReturnKeyGo),
|
||||
@"google": @(UIReturnKeyGoogle),
|
||||
@"join": @(UIReturnKeyJoin),
|
||||
@"next": @(UIReturnKeyNext),
|
||||
@"route": @(UIReturnKeyRoute),
|
||||
@"search": @(UIReturnKeySearch),
|
||||
@"send": @(UIReturnKeySend),
|
||||
@"yahoo": @(UIReturnKeyYahoo),
|
||||
@"done": @(UIReturnKeyDone),
|
||||
@"emergency-call": @(UIReturnKeyEmergencyCall),
|
||||
},
|
||||
@"UIView": @{
|
||||
@"ContentMode": @{
|
||||
@"ScaleToFill": @(UIViewContentModeScaleToFill),
|
||||
@"ScaleAspectFit": @(UIViewContentModeScaleAspectFit),
|
||||
@"ScaleAspectFill": @(UIViewContentModeScaleAspectFill),
|
||||
@"Redraw": @(UIViewContentModeRedraw),
|
||||
@"Center": @(UIViewContentModeCenter),
|
||||
@"Top": @(UIViewContentModeTop),
|
||||
@"Bottom": @(UIViewContentModeBottom),
|
||||
@"Left": @(UIViewContentModeLeft),
|
||||
@"Right": @(UIViewContentModeRight),
|
||||
@"TopLeft": @(UIViewContentModeTopLeft),
|
||||
@"TopRight": @(UIViewContentModeTopRight),
|
||||
@"BottomLeft": @(UIViewContentModeBottomLeft),
|
||||
@"BottomRight": @(UIViewContentModeBottomRight),
|
||||
},
|
||||
},
|
||||
} mutableCopy];
|
||||
|
||||
[_viewManagers enumerateKeysAndObjectsUsingBlock:^(NSString *name, RCTViewManager *manager, BOOL *stop) {
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
*/
|
||||
|
||||
#import "RCTViewManager.h"
|
||||
#import "RCTConvert.h"
|
||||
|
||||
@interface RCTConvert(UIDatePicker)
|
||||
|
||||
+ (UIDatePickerMode)UIDatePickerMode:(id)json;
|
||||
|
||||
@end
|
||||
|
||||
@interface RCTDatePickerManager : RCTViewManager
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#import "RCTDatePickerManager.h"
|
||||
|
||||
#import "RCTBridge.h"
|
||||
#import "RCTConvert.h"
|
||||
#import "RCTEventDispatcher.h"
|
||||
#import "UIView+React.h"
|
||||
|
||||
@@ -20,7 +19,7 @@ RCT_ENUM_CONVERTER(UIDatePickerMode, (@{
|
||||
@"time": @(UIDatePickerModeTime),
|
||||
@"date": @(UIDatePickerModeDate),
|
||||
@"datetime": @(UIDatePickerModeDateAndTime),
|
||||
//@"countdown": @(UIDatePickerModeCountDownTimer) // not supported yet
|
||||
@"countdown": @(UIDatePickerModeCountDownTimer), // not supported yet
|
||||
}), UIDatePickerModeTime, integerValue)
|
||||
|
||||
@end
|
||||
@@ -31,9 +30,12 @@ RCT_EXPORT_MODULE()
|
||||
|
||||
- (UIView *)view
|
||||
{
|
||||
// TODO: we crash here if the RCTDatePickerManager is released
|
||||
// while the UIDatePicker is still sending onChange events. To
|
||||
// fix this we should maybe subclass UIDatePicker and make it
|
||||
// be its own event target.
|
||||
UIDatePicker *picker = [[UIDatePicker alloc] init];
|
||||
[picker addTarget:self
|
||||
action:@selector(onChange:)
|
||||
[picker addTarget:self action:@selector(onChange:)
|
||||
forControlEvents:UIControlEventValueChanged];
|
||||
return picker;
|
||||
}
|
||||
@@ -56,17 +58,10 @@ RCT_REMAP_VIEW_PROPERTY(timeZoneOffsetInMinutes, timeZone, NSTimeZone)
|
||||
|
||||
- (NSDictionary *)constantsToExport
|
||||
{
|
||||
UIDatePicker *dp = [[UIDatePicker alloc] init];
|
||||
[dp layoutIfNeeded];
|
||||
|
||||
UIDatePicker *view = [[UIDatePicker alloc] init];
|
||||
return @{
|
||||
@"ComponentHeight": @(CGRectGetHeight(dp.frame)),
|
||||
@"ComponentWidth": @(CGRectGetWidth(dp.frame)),
|
||||
@"DatePickerModes": @{
|
||||
@"time": @(UIDatePickerModeTime),
|
||||
@"date": @(UIDatePickerModeDate),
|
||||
@"datetime": @(UIDatePickerModeDateAndTime),
|
||||
}
|
||||
@"ComponentHeight": @(view.intrinsicContentSize.height),
|
||||
@"ComponentWidth": @(view.intrinsicContentSize.width),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -27,10 +27,10 @@ RCT_EXPORT_VIEW_PROPERTY(selectedIndex, NSInteger)
|
||||
|
||||
- (NSDictionary *)constantsToExport
|
||||
{
|
||||
RCTPicker *pv = [[RCTPicker alloc] init];
|
||||
RCTPicker *view = [[RCTPicker alloc] init];
|
||||
return @{
|
||||
@"ComponentHeight": @(CGRectGetHeight(pv.frame)),
|
||||
@"ComponentWidth": @(CGRectGetWidth(pv.frame))
|
||||
@"ComponentHeight": @(view.intrinsicContentSize.height),
|
||||
@"ComponentWidth": @(view.intrinsicContentSize.width)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
*/
|
||||
|
||||
#import "RCTViewManager.h"
|
||||
#import "RCTConvert.h"
|
||||
|
||||
@interface RCTConvert (UIScrollView)
|
||||
|
||||
+ (UIScrollViewKeyboardDismissMode)UIScrollViewKeyboardDismissMode:(id)json;
|
||||
|
||||
@end
|
||||
|
||||
@interface RCTScrollViewManager : RCTViewManager
|
||||
|
||||
|
||||
@@ -10,11 +10,22 @@
|
||||
#import "RCTScrollViewManager.h"
|
||||
|
||||
#import "RCTBridge.h"
|
||||
#import "RCTConvert.h"
|
||||
#import "RCTScrollView.h"
|
||||
#import "RCTSparseArray.h"
|
||||
#import "RCTUIManager.h"
|
||||
|
||||
@implementation RCTConvert (UIScrollView)
|
||||
|
||||
RCT_ENUM_CONVERTER(UIScrollViewKeyboardDismissMode, (@{
|
||||
@"none": @(UIScrollViewKeyboardDismissModeNone),
|
||||
@"on-drag": @(UIScrollViewKeyboardDismissModeOnDrag),
|
||||
@"interactive": @(UIScrollViewKeyboardDismissModeInteractive),
|
||||
// Backwards compatibility
|
||||
@"onDrag": @(UIScrollViewKeyboardDismissModeOnDrag),
|
||||
}), UIScrollViewKeyboardDismissModeNone, integerValue)
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTScrollViewManager
|
||||
|
||||
RCT_EXPORT_MODULE()
|
||||
@@ -53,14 +64,10 @@ RCT_DEPRECATED_VIEW_PROPERTY(throttleScrollCallbackMS, scrollEventThrottle)
|
||||
- (NSDictionary *)constantsToExport
|
||||
{
|
||||
return @{
|
||||
// TODO: unused - remove these?
|
||||
@"DecelerationRate": @{
|
||||
@"Normal": @(UIScrollViewDecelerationRateNormal),
|
||||
@"Fast": @(UIScrollViewDecelerationRateFast),
|
||||
},
|
||||
@"KeyboardDismissMode": @{
|
||||
@"None": @(UIScrollViewKeyboardDismissModeNone),
|
||||
@"Interactive": @(UIScrollViewKeyboardDismissModeInteractive),
|
||||
@"OnDrag": @(UIScrollViewKeyboardDismissModeOnDrag),
|
||||
@"normal": @(UIScrollViewDecelerationRateNormal),
|
||||
@"fast": @(UIScrollViewDecelerationRateFast),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ RCT_EXPORT_MODULE()
|
||||
|
||||
RCT_EXPORT_VIEW_PROPERTY(caretHidden, BOOL)
|
||||
RCT_EXPORT_VIEW_PROPERTY(autoCorrect, BOOL)
|
||||
RCT_EXPORT_VIEW_PROPERTY(enabled, BOOL)
|
||||
RCT_REMAP_VIEW_PROPERTY(editable, enabled, BOOL)
|
||||
RCT_EXPORT_VIEW_PROPERTY(placeholder, NSString)
|
||||
RCT_EXPORT_VIEW_PROPERTY(placeholderTextColor, UIColor)
|
||||
RCT_EXPORT_VIEW_PROPERTY(text, NSString)
|
||||
@@ -36,6 +36,7 @@ RCT_EXPORT_VIEW_PROPERTY(keyboardType, UIKeyboardType)
|
||||
RCT_EXPORT_VIEW_PROPERTY(returnKeyType, UIReturnKeyType)
|
||||
RCT_EXPORT_VIEW_PROPERTY(enablesReturnKeyAutomatically, BOOL)
|
||||
RCT_EXPORT_VIEW_PROPERTY(secureTextEntry, BOOL)
|
||||
RCT_REMAP_VIEW_PROPERTY(password, secureTextEntry, BOOL) // backwards compatibility
|
||||
RCT_REMAP_VIEW_PROPERTY(color, textColor, UIColor)
|
||||
RCT_REMAP_VIEW_PROPERTY(autoCapitalize, autocapitalizationType, UITextAutocapitalizationType)
|
||||
RCT_CUSTOM_VIEW_PROPERTY(fontSize, CGFloat, RCTTextField)
|
||||
|
||||
Reference in New Issue
Block a user