[ret] = PerformSelector(s$[, ...])
s$
.
The selector specified by s$
will then be run with an NSMutableArray
as its sole argument.
Inside that array, index 1 will contain the lua_State
and index 2 will contain a pointer to
a hwPluginAPI
structure, allowing you to access all public APIs and especially the Lua VM.
Indices 3 and 4 contain the UIViewController
and UIView
, respectively. Upon return, you
must set index 0 to an NSValue
containing an int
which specifies the return code of your
function. This is all very similar to the way functions in Hollywood plugins are executed.
So please see the Hollywood SDK documentation for more details (especially the chapters
concerning writing library plugins).
You need to implement the desired selector in your application's delegate in native code. This is what a custom selector might look like in Objective C:
- (void)MyTestSelector:(NSMutableArray *) args { // get essential pointers from Hollywood lua_State *L = (lua_State *) [((NSValue *) [args objectAtIndex:1]) pointerValue]; hwPluginAPI *hwcl = (hwPluginAPI *) [((NSValue *) [args objectAtIndex:2]) pointerValue]; // we return 1 because we push one string int retval = 1; // print string at stack index 2 printf("%s\n", hwcl->LuaBase->luaL_checklstring(L, 2, NULL)); // push return value hwcl->LuaBase->lua_pushstring(L, "Test return value"); // set return value [args replaceObjectAtIndex:0 withObject:[NSValue value:&retval withObjCType:@encode(int*)]]; } |
This selector will print the string argument that is passed to the PerformSelector()
call in argument 2. It will then return the string "Test return value" to the
Hollywood script. You could run this selector from your Hollywood script like this:
DebugPrint(PerformSelector("MyTestSelector", "Test")) |
This code will pass the string "Test" to the MyTestSelector
method. DebugPrint()
will print "Test return value" because that is the return value of MyTestSelector
.
Keep in mind that your selector function will not be run on the main (UI) thread but on Hollywood's VM thread. So when accessing UIKit functionality (or other frameworks that need to run on the main thread) you need to delegate the respective code to the main thread first.