2016-04-12 16 views
8

私はReactネイティブアプリでABNewPersonViewControllerを使用しようとしています。これはObjective-Cでどのように使用されているのですか?React NativeにネイティブUIViewControllerを表示するにはどうすればよいですか? (ちょうどUIViewを使用することはできません)

ABNewPersonViewController *picker = [[ABNewPersonViewController alloc] init]; 
picker.newPersonViewDelegate = self; 

UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:picker]; 
[self presentViewController:navigation animated:NO completion:nil]; 

どのようにしてReact Nativeでこれを行いますか?私はそれがUIViewControllerではなく、UIViewであるので、ブリッジされたUIコンポーネントを書くことはできません。

それは

答えて

1

あなたは空のUIViewをマウントし、あなたのUIViewControllerを提示するための主に責任があるブリッジUIコンポーネントを実装するために再実装を教えないでください。この手法の最も単純な例はRCTModalHostViewです。 check out the source code

React Nativeは、最も近いUIViewControllerを見つけるためにビュー階層を登るreactViewControllerというプロパティを追加するUIViewのカテゴリを定義します。カスタムビューコントローラを提示するために、こののUIViewControllerを使用します。

- (void)didMoveToWindow 
{ 
    [super didMoveToWindow]; 

    if (!_isPresented && self.window) { 
    [self.reactViewController presentViewController:_customViewController 
              animated:NO 
             completion:nil]; 
    _isPresented = YES; 
    } 
} 
3

は、ここで私のために働いてしまったものです。

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:私は情報を伝達するための最良の方法を実装するようhttp://moduscreate.com/leverage-existing-ios-views-react-native-app/

私が更新します:

#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 

このチュートリアルでは、より詳細な情報を持っていますRNに戻る。

関連する問題