我想创建一个简单的UIView子类,然后通过桥接到React Native将其作为React Native JavaScript组件提供。我遵循了这些指示,并翻阅了许多反应源代码:https://facebook.github.io/react-native/docs/native-components-ios.html
不幸的是,我不知道我的React Native组件在哪里失败。这是我的Obj-C经理班:
// header
#import "RCTViewManager.h"
#import "ColorPicker.h"
@interface ColorPickerManager : RCTViewManager
@end
// implementation
#import "ColorPickerManager.h"
@interface ColorPickerManager()
@property (nonatomic) ColorPicker * colorPicker;
@end
@implementation ColorPickerManager
RCT_EXPORT_MODULE()
- (instancetype)init {
self = [super init];
if ( self ) {
NSLog(@"color picker manager init");
self.colorPicker = [[ColorPicker alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
}
return self;
}
- (UIView *)view {
NSLog(@"color picker manager -view method");
return self.colorPicker;
}
@end
这是我通过上述-view
方法提供的简单的UIView子类:
// header
#import <UIKit/UIKit.h>
@interface ColorPicker : UIView
@end
// implementation
#import "ColorPicker.h"
@interface ColorPicker()
@property (nonatomic) NSArray * colors;
@end
@implementation ColorPicker
- (instancetype)init {
NSLog(@"init");
self = [super init];
if ( self ) {
[self setUp];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
NSLog(@"init with frame: %@", NSStringFromCGRect(frame));
self = [super initWithFrame:frame];
if ( self ) {
[self setUp];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"init with coder: %@", aDecoder);
self = [super initWithCoder:aDecoder];
if ( self ) {
[self setUp];
}
return self;
}
- (void)setUp {
self.colors = @[[UIColor redColor], [UIColor greenColor], [UIColor blueColor]];
self.backgroundColor = self.colors[0];
}
- (void)layoutSubviews {
NSLog(@"layout subviews");
}
@end
最后,这是我的反应组件被桥接到JavaScript:
var { requireNativeComponent } = require('react-native');
var ColorPicker = requireNativeComponent('ColorPicker', null);
module.exports = ColorPicker;
debugger;
它的声明和呈现在屏幕上:
'use strict';
var React = require('react-native');
var ColorPicker = require('./BridgedComponents/ColorPicker.js');
var {
StyleSheet
} = React;
var iOS = React.createClass({
render: function() {
debugger;
return (
<ColorPicker style={styles.container} />
);
}
});
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
});
AppRegistry.registerComponent('iOS', () => iOS);
当我希望看到100x100的红色正方形时,这不会导致任何渲染到屏幕。我尝试过:
UIView
的子视图,我的rootViewController
将完全呈现我的预期。ColorPicker
在呈现到屏幕时以及通过undefined
创建时不是debugger
。 height: 100, width: 100
的样式应用于呈现的ColorPicker
,但它仍然没有显示红色的静音RN Gurus的问题 - 我还能做些什么来验证我的视图是否正确桥接? - 在检查这些实例以验证视图是否设置正确时,Chrome调试器中是否应该查找任何内容? - 我试过跟踪回购中的一些源代码,但我还是React的新手,我不是100%它的全部工作方式。 - 当我创建一个桥接组件时,我希望在Obj-C / Swift类中设置外观和布局,或者在使用CSS的JavaScript中更好。在我看来,前者是可以预期的。
非常感谢任何帮助/建议。
答案 0 :(得分:1)
除了添加ColorPicker
视图外,您没有看到任何内容。
问题是ReactNative正在管理其backgroundColor
属性并覆盖您的初始选择。
您可以在ColorPicker.m
中添加以下方法并设置断点以查看它何时发生:
- (void)setBackgroundColor:(UIColor *)backgroundColor {
NSLog(@"setBackgroundColor %@", backgroundColor);
[super setBackgroundColor:backgroundColor];
}
您应该让React Native处理桥接组件的大小和外观。 但它完全发现自定义子视图完全由本机控制。
此外,只要您调用ColorPickerManager
方法,您的view
should return a new instance视图就会被桥接。
即。你应该用这个:
@implementation ColorPickerManager
RCT_EXPORT_MODULE()
- (instancetype)init {
self = [super init];
if ( self ) {
NSLog(@"color picker manager init");
}
return self;
}
- (UIView *)view {
NSLog(@"color picker manager -view method");
return [[ColorPicker alloc] init];
}
@end
否则,您将无法显示ColorPicker组件的2个(或更多个)实例。