Deconstructing your solution: the part for getting the to the Corona root view (and therefore allowing adding subviews) definitely works and here it is in isolation. You only need to remember to include CoronaRuntime header via #import “CoronaRuntime.h”.
void \*platformContext = CoronaLuaGetContext( L ); id\<CoronaRuntime\> runtime = (id\<CoronaRuntime\>)platformContext; UIViewController \*root = runtime.appViewController;
So that’s that for a view controller. I have also found that, using Objective C you can find the top most controller in your hierarchy and present your own view controller to that. That works too but I prefer what you came up with on the basis that hopefully you are getting the correct view controller at all times, irrespective of what happens in the underlying Corona app.
For the three methods mentioned (setListener, setRuntime, showNativePicker), they are not methods in the class UIViewController (and in fact my XCode gives me a nice red blob and insults me in 3 languages). They would not even compile so I was wondering if they work in your case and how comes. You might have added those methods to UIViewController class somehow?