- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想创建一个简单的 UIView 子类,然后通过桥接到 React Native 使其作为 React Native JavaScript 组件可用。我遵循了这些指示并浏览了大量的 react 源代码: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;
}
@结束
这是我通过上述 -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 的 React 组件:
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 的红色方 block 时,这不会导致屏幕上出现任何渲染。我尝试过的:
UIView
如果我从项目中删除所有 React Native 代码并将此 View 作为不同 rootViewController
的 subview ,将完全按照我的预期呈现。 .ColorPicker
在我的主 .js 文件中不是 undefined
当时它呈现在屏幕上,当它通过 debugger
创建时. height: 100, width: 100
的样式到呈现的ColorPicker
但它仍然没有显示红色正方形RN 大师的问题- 我还能做些什么来验证我的 View 是否正确桥接?- 在检查这些实例以验证 View 设置是否正确时,我应该在 Chrome 调试器中寻找什么吗?- 我已经尝试遵循 repo 中的一些源代码,但我仍然是 React 的新手,我不是 100% 了解它是如何工作的。- 当我创建桥接组件时,我希望在 Obj-C/Swift 类中设置外观和布局,还是在 JavaScript 和 CSS 中设置更好。在我看来,前者是意料之中的。
任何帮助/建议将不胜感激。
最佳答案
除了添加了 ColorPicker
View 之外,您什么也看不到。
问题是 ReactNative 自行管理其 backgroundColor
属性并覆盖您的初始选择。
您可以在 ColorPicker.m
中添加以下方法并设置断点以查看它何时发生:
- (void)setBackgroundColor:(UIColor *)backgroundColor {
NSLog(@"setBackgroundColor %@", backgroundColor);
[super setBackgroundColor:backgroundColor];
}
您应该让 React Native 处理桥接组件的大小和外观。但是完全可以找到完全由 native 端控制的自定义 subview 。
还有你的 ColorPickerManager
should return a new instance调用 view
方法时桥接的 View 。
即你应该使用这个:
@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 个(或更多)实例。
关于ios - 为什么我的 React Native 桥接 iOS 组件不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32653805/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!