How can I present a native UIViewController in React Native? (Can't use just a UIView)

后端 未结 2 1334
不思量自难忘°
不思量自难忘° 2020-12-28 17:47

I\'m trying to use ABNewPersonViewController in my React Native app. This is how it\'s used in Objective-C:

ABNewPersonViewController *picker = [[ABNewPerson         


        
相关标签:
2条回答
  • 2020-12-28 18:25

    You want to implement a bridged UI component that mounts an empty UIView and is responsible primarily for presenting your UIViewController. The simplest example of this technique is in RCTModalHostView; check out the source code.

    Notably, React Native defines a category on UIView that adds a property called reactViewController which climbs the view hierarchy to find the closest UIViewController. Use this UIViewController to present your custom view controller:

    - (void)didMoveToWindow
    {
      [super didMoveToWindow];
    
      if (!_isPresented && self.window) {
        [self.reactViewController presentViewController:_customViewController
                                               animated:NO
                                             completion:nil];
        _isPresented = YES;
      }
    }
    
    0 讨论(0)
  • 2020-12-28 18:29

    Here's what ended up working for me.

    CreateContact.h:

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import <AddressBook/AddressBook.h>
    #import <AddressBookUI/AddressBookUI.h>
    #import "RCTBridgeModule.h"
    
    @interface CreateContact : NSObject <ABNewPersonViewControllerDelegate, RCTBridgeModule>
    
    @end
    

    CreateContact.m:

    #import "CreateContact.h"
    #import "AppDelegate.h"
    
    @implementation CreateContact
    
    RCT_EXPORT_MODULE(CreateContact);
    
    
    RCT_EXPORT_METHOD(presentContact) {
    
        dispatch_async(dispatch_get_main_queue(), ^{
            ABNewPersonViewController *picker = [[ABNewPersonViewController alloc] init];
            picker.newPersonViewDelegate = self;
            UINavigationController* contactNavigator = [[UINavigationController alloc] initWithRootViewController:picker];
            AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            [delegate.window.rootViewController presentViewController:contactNavigator animated:NO completion:nil];
        });
    }
    
    - (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person
    {
        [newPersonViewController dismissViewControllerAnimated:YES completion:nil];
    }
    @end
    

    This tutorial has more detail: http://moduscreate.com/leverage-existing-ios-views-react-native-app/

    I'll update as I implement the best way to communicate information back to RN.

    0 讨论(0)
提交回复
热议问题