升级到 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 - 性能)

将 react-native 升级到最新版本 0.61.4 后找不到以下原生模块

react native 0.43 升级后问题:点击警告框(下面的黄色框)会使应用崩溃