Comments (14)
Nevermind, I thought that the method wasn't even running for some reason but it's definitely running. For some reason my code isn't updating some state like I thought it would. Still, is that the right way to expose an Obj-C method?
from react-native.
Hm, when I do NSLog(@"%x", teapotNode_);
it prints 0. I don't know Obj-C too well, but does it not crash when sending messages to a null pointer? Anyway, it does seem to be calling the method as a static method, not as an instance method. How do I expose an instance method?
EDIT: I'm assuming it's possible because inside RCTUIManager.m
it exports several instance methods. Some of them even reference self
. But I see nothing outside of RCT_EXPORT()
that sets the instance for the exporter...
EDIT2: Oh, I see in initWithJavaScriptExecutor
that it allocates a single instance of the class, so the class is meant to be a single module instance. Might be nice to have a way to register an existing instance as a module?
from react-native.
I don't know Obj-C too well, but does it not crash when sending messages to a null pointer?
No, it doesn't crash; it returns nil.
from react-native.
Ok.
I added a getModule
method on RCTBridge
so now I just do TeapotController *vc = [bridge getModule:@"TeapotController"];
after creating the root view. I'm sure this is not the right way to do it. But I hacked. And it was fun.
from react-native.
I think two things are going on here:
A) Not sure if you're already doing this, but your TeapotController
needs to conform to the RCTNativeModule
protocol in order to be registered with the bridge.
B) If a class conforms to the RCTNativeModule
protocol, it will be instantiated by the RCTBridge
for use in the RCTRootView
. Where do you set the teapotNode_
ivar?
from react-native.
The teapotNode_
is just a scene node object that is created in the viewDidLoad
controller method. I did add that protocol:
@interface TeapotController : GLViewController<RCTNativeModule> {
TeapotNode *teapotNode_;
BOOL tapIsValid_;
CGPoint lastDragPoints_[2];
CGPoint touchStartPoint_;
}
And it's all working fine. The problem is that the bridge instantiates the TeapotController class, but I don't see any way to get to it through the RCTRootView class. I had to add a method myself to dig into the internal modules and return the instance.
from react-native.
To leave a clearer comment about what is needed: we need to be able to access the modules (that are actually class instances) that the bridge creates to have a generic way of talking between iOS and JS. These classes will have state, and when a callback (say from user input) calls back into the iOS world we need access to it.
from react-native.
@jlongster mind updating the title of the issue to reflect what needs to be done here outside of documentation?
from react-native.
Are the discussed items here obsolete? I grep'ed for RCTNativeModule and initWithJavaScriptExecutor across the entire repo and found nothing.
from react-native.
@jaygarcia RCTNativeModule is now called RCTBridgeModule.
from react-native.
Thanks :) I should have replied to my comment. I have been able to grasp things now from the JS <> ObJC side. It wasn't easy, but with enough digging through the ReactKit code, I figured much of what I needed to out.
The Macros are simply genius. I wish the Cordova guys were smart enough to do that.
from react-native.
Hey @jaygarcia , see new guide at https://github.com/facebook/react-native/blob/master/docs/NativeModulesIOS.md. Let us know if you think something should be added there.
from react-native.
Should this be closed?
@frantic , i think the article is pretty air tight for the moment :)
from react-native.
Cool! :)
from react-native.
Related Issues (20)
- Error: package com.facebook.react.modules.storage does not exist import com.facebook.react.modules.storage HOT 4
- Heap snapshot throwing `RangeError: Invalid typed array length: -1` on latest chrome version HOT 8
- ☂️ Help us migrate Android tests to AssertJ HOT 23
- Accessibility issue - Android with TalkBack - accessibilityRole="link" is not available when user tries to navigate via links (TalkBack menu)
- App Crash when using ReactNativeFile in apollo upload client HOT 4
- createBundleReleaseJsAndAssets\index.android.bundle:1322:18: warning: the variable "DebuggerInternal" was not declared in function "__shouldPauseOnThrow" typeof DebuggerInternal !== 'undefined' HOT 7
- automaticallyAdjustKeyboardInsets doesn't work in the new arch HOT 2
- App Crashes - On upgrading to Android 14(SDK 34) for "react-native": "0.68.2", HOT 4
- No hot reloading when change font scale
- react-native 0.74.3 new project sync error HOT 3
- Codegen: Int32 generate double on Java HOT 2
- Issue with Top Padding in Text Component on Android (includeFontPadding : false not working🥹) HOT 5
- RTL Layout Direction Not Updating after app reload with New React Native Architecture HOT 10
- Unable to handle hardware back press in Brownfield Setup with BackHandler HOT 5
- App could not Build when trying upgrade sdk 33 to 34 HOT 4
- App could not Build when trying upgrade sdk 33 to 34 (Unexpected error during link, AAPT2 aapt2-4.2.2-7147631-linux Daemon) HOT 4
- react native android crashed in the real device when target API level is changed from 33 to 34. HOT 7
- Upgrade pretty-format to 29 HOT 2
- What is the future of Headless JS? HOT 6
- The react-native environment calls null as a function if it's passed in the finally block HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react-native.