Call method in AppController.m from scene

Call method in AppController.m from scene
0.0 0

#1

I’d like to call a method in AppController.m from HelloWorldScene.cpp Is this possible? So in my AppController.m I have the following:

- (void) showReviewPrompt {
    [Appirater tryToShowPrompt];
}

And in HelloWorldScene I am trying to do:

AppController *appController = (AppController *)[[UIApplication sharedApplication] delegate];
[appController showReviewPrompt];

I get an undeclared identifier error for AppController and when I try to import it I get even more errors.


#2

yeah, you can’t just online objective-c and c++ like that. At a minimum you would need to change some build settings to even accomplish that.


#3

I think what you need is called a “wrapper” class. Basically, an extra class in between to handle communication.

What you need to do is to create a header for your wrapper class that contains no Objective-C code, and will probably declare a static function that will call the Objective-C code. Then your wrapper class file (.mm; needs to be an Objective-C file) will include your header file and AppController.h, and implement your static function, which will call your function in AppController. For example:

// AppControllerWrapper.hpp
// NO OBJECTIVE-C CODE
class AppControllerWrapper {
public:
    static void showReviewPrompt();
};

// AppControllerWrapperIOS.mm
// CONTAINS OBJECTIVE-C CODE
#include "AppControllerWrapper.h"
#include "AppController.h"

void AppControllerWrapper::showReviewPrompt() {
    AppController *appController = (AppController *)[[UIApplication sharedApplication] delegate];
    [appController showReviewPrompt];
}

// HelloWorldScene.cpp
#include "AppControllerWrapper.hpp"
...
AppControllerWrapper::showReviewPrompt(); // inside a function

I tested this and it seems to work.

So, basically, your C++ classes can’t contain any Objective-C, which includes using headers that contain any Objective-C, but because you can mix C++ and Objective-C, you can create a C+±style header for your C++ class to include and then call your Objective-C code from the class file.

Note: If you want to run your app on platforms other than iOS and Mac, you will need to make sure you don’t include your .mm for those platforms (which is why I called it AppControllerIOS.mm) and implement the class for your platform as a C++ file.


#4

Can I use some of your post in our docs?


#5

Sure thing. Spread the knowledge!