升级到 Xcode8 后 React Native RCTCustomScrollView 损坏
Posted
技术标签:
【中文标题】升级到 Xcode8 后 React Native RCTCustomScrollView 损坏【英文标题】:React Native RCTCustomScrollView broken after upgrading to Xcode8 【发布时间】:2016-11-30 15:53:23 【问题描述】:显然,this is a well known issue 用于在升级到 Xcode 8 时做出本机反应。我已按照 this 指南修复了我遇到的错误,但是当我的应用程序尝试加载 <ScrollView/>
组件时,我仍然收到以下错误.
[RCTCustomScrollView refreshControl]: unrecognized selector sent to instance 0x16099e00
我的RCTScrollView.m
中似乎每个人都认为导致问题的代码如下所示:
- (void)setRefreshControl:(RCTRefreshControl *)refreshControl
if (refreshControl)
[refreshControl removeFromSuperview];
refreshControl = refreshControl;
[self addSubview:refreshControl];
- (void)removeReactSubview:(UIView *)subview
if ([subview isKindOfClass:[RCTRefreshControl class]])
_scrollView.refreshControl = nil;
else
RCTAssert(_contentView == subview, @"Attempted to remove non-existent subview");
_contentView = nil;
[subview removeFromSuperview];
当我在运行 ios 10.1.1 的设备上运行它时,一切似乎都运行良好,但是当我在运行 9.3 的设备上尝试时,它在尝试加载 <ScrollView/>
时崩溃。
重要提示 - 我正在运行 react native 0.28,目前处于无法升级的紧张状态,因此我必须手动进行修复。
【问题讨论】:
【参考方案1】:我知道这是一篇较旧的帖子,但对于 Xcode 8、iOS 9.3 (iPad 2/iPad Mini)、React Native 0.24.1,我在 RCTScrollView.m 中进行了此更改作为修复。
@implementation RCTCustomScrollView
__weak UIView *_dockedHeaderView;
// Added the following line
RCTRefreshControl *_refreshControl;
// Also added this
@synthesize refreshControl = _refreshControl;
【讨论】:
这对我很有帮助。非常感谢【参考方案2】:我找到的唯一解决方案是这个,转到 RCTScrollView.m 并将 [_scrollView refreshControl]
替换为 [_scrollView respondsToSelector: @selector(refreshControl)]
- (NSArray<UIView *> *)reactSubviews
if (_contentView && [_scrollView respondsToSelector: @selector(refreshControl)])
return @[_contentView, [_scrollView refreshControl]];
return _contentView ? @[_contentView] : @[];
【讨论】:
以上是关于升级到 Xcode8 后 React Native RCTCustomScrollView 损坏的主要内容,如果未能解决你的问题,请参考以下文章
升级到 0.24.1 后,react native fetch 返回 Blob 而不是 JSON
升级到 React Native 26 后使用箭头函数时不再绑定
升级到 React Native 0.27.0 后 Systrace 不显示 JavaScript 内容
Apple 在升级到 React Native 0.59 后拒绝了二进制文件(2.3.1 - 性能)