GithubHelp home page GithubHelp logo

Comments (14)

jlongster avatar jlongster commented on April 19, 2024

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.

jlongster avatar jlongster commented on April 19, 2024

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.

sophiebits avatar sophiebits commented on April 19, 2024

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.

jlongster avatar jlongster commented on April 19, 2024

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.

a2 avatar a2 commented on April 19, 2024

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.

jlongster avatar jlongster commented on April 19, 2024

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.

jlongster avatar jlongster commented on April 19, 2024

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.

vjeux avatar vjeux commented on April 19, 2024

@jlongster mind updating the title of the issue to reflect what needs to be done here outside of documentation?

from react-native.

jaygarcia avatar jaygarcia commented on April 19, 2024

Are the discussed items here obsolete? I grep'ed for RCTNativeModule and initWithJavaScriptExecutor across the entire repo and found nothing.

from react-native.

nicklockwood avatar nicklockwood commented on April 19, 2024

@jaygarcia RCTNativeModule is now called RCTBridgeModule.

from react-native.

jaygarcia avatar jaygarcia commented on April 19, 2024

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.

frantic avatar frantic commented on April 19, 2024

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.

jaygarcia avatar jaygarcia commented on April 19, 2024

Should this be closed?

@frantic , i think the article is pretty air tight for the moment :)

from react-native.

frantic avatar frantic commented on April 19, 2024

Cool! :)

from react-native.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.