react-native-navigation ios - 将 UIViewController 推送到导航堆栈

Posted

技术标签:

【中文标题】react-native-navigation ios - 将 UIViewController 推送到导航堆栈【英文标题】:react-native-navigation ios - push UIViewController to navigation stack 【发布时间】:2017-07-28 15:31:02 【问题描述】:

我正在构建一个包含原生 ios 视图和 react-native 屏幕的导航堆栈。但是当我推送原生 iOS 视图时,视图布局并没有按照情节提要中的设计出现。我在 Xcode 中为原生视图使用自动布局。

ICNativeViewManager.h
---------------------
#import <React/RCTViewManager.h>

@interface ICNativeViewManager : RCTViewManager

@end

ICNativeViewManager.m
---------------------
#import <React/RCTViewManager.h>
#import <React/RCTView.h>

#import "ICNativeViewManager.h"

@implementation ICNativeViewManager

UIViewController *vc;

RCT_EXPORT_MODULE()

-(UIView *)view

  if (vc == nil)
  
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ICNativeUI" bundle:nil];
    vc = [storyboard instantiateInitialViewController];
  
  return vc.view;


RCT_EXPORT_VIEW_PROPERTY(labelText, NSString)

@end

Xcode 中的设计:

View Design in Storyboard

模拟器中显示的内容:

View shown in Simulator

【问题讨论】:

【参考方案1】:
    您不应缓存 -view 方法的输出,始终返回具有所有新依赖项的新视图,例如视图控制器。 您应该使用约束来布局您的视图,因为 ReactNative 通过挂载过程发送更改视图框架的方法。没有约束的布局可能会被破坏。 要计算视图的框架 React Native 使用 YogaLayout(旧的 CSSLayout),请确保它计算正确的视图大小。如果不实现 ViewManager 的 -shadowView 方法并返回具有正确宽度和高度属性值的 RCTShadowView 实例。

【讨论】:

#2 - 我加载视图控制器的情节提要使用自动布局。因此,视图已经在使用约束进行布局。 #1 - 我必须保留对视图控制器的引用。否则,它会在 view() 方法返回后立即被释放,从而阻止与视图的进一步交互。 @ramg 在您的情况下,无法为超级视图设置约束,因为在设计时不存在超级视图(一个原型)。 如果您需要旧视图控制器,您应该创建新视图并将其提供给旧视图控制器。如果您返回旧视图,在某些情况下,react 可能会使应用程序崩溃。【参考方案2】:

我已经设法使用带有约束的容器视图解决了布局问题。在点击按钮时接收回调仍然有问题。

-(UIView *)view

  UIView *parentView = [ICNativeView new];
  parentView.translatesAutoresizingMaskIntoConstraints = NO;
  UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ICNativeUI" bundle:nil];
  self.viewController = [storyboard instantiateInitialViewController];
  UIView *nativeView = self.viewController.view;
  [parentView addSubview:nativeView];
  [parentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[nativeView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(nativeView)]];
  [parentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[nativeView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(nativeView)]];
  return parentView;

Layout Fixed

【讨论】:

以上是关于react-native-navigation ios - 将 UIViewController 推送到导航堆栈的主要内容,如果未能解决你的问题,请参考以下文章

react-native-navigation 底部标签样式

React-native-navigation:goBack() 不起作用

react-native-navigation如何在`shouldComponentUpdate`中检测当前屏幕

React-native-navigation 选项卡栏中心圆圈图标

React-Native-Navigation (WIX):如何更新底部标签的徽章计数?

在bottomTab配置react-native-navigation中设置图标大小