[ret] = PerformSelector(s$[, ...])
s$
angegeben werden.
Der in s$
angegebene Selektor wird dann mit einem NSMutableArray
als einziges Argument ausgeführt. Innerhalb dieses Feldes enthält
Index 1 den lua_State
und Index 2 beinhaltet einen Zeiger
auf eine hwPluginAPI-Struktur
, die es Ihnen erlaubt, auf
alle öffentlichen APIs und insbesondere die Lua-VM zuzugreifen.
Die Indizes 3 und 4 enthalten den UIViewController
und UIView
.
Bei der Rückgabe müssen Sie den Index 0 auf eine NSValue
setzen, die einen int
enthält, der den Rückgabecode von Ihrer
Funktion angibt. Sehen Sie bitte in der Hollywood SDK-Dokumentation
für weitere Details nach (vor allem die Kapitel zum Schreiben
von Bibliotheken-Plugins).
Sie müssen den gewünschten Selektor im Appdelegate Ihrer Anwendung in nativem Code implementieren. So könnte ein benutzerdefinierter Selektor in Objective-C aussehen:
- (void)MyTestSelector:(NSMutableArray *) args { // notwendige Daten von Hollywood holen lua_State *L = (lua_State *) [((NSValue *) [args objectAtIndex:1]) pointerValue]; hwPluginAPI *hwcl = (hwPluginAPI *) [((NSValue *) [args objectAtIndex:2]) pointerValue]; // es gibt einen Rückgabewert (Zeichenkette) int retval = 1; // Zeichenkette im Stackindex 2 ausgeben printf("%s\n", hwcl->LuaBase->luaL_checklstring(L, 2, NULL)); // Rückgabestring auf Stack legen hwcl->LuaBase->lua_pushstring(L, "Test return value"); // Rückgabewert setzen [args replaceObjectAtIndex:0 withObject:[NSValue value:&retval withObjCType:@encode(int*)]]; } |
Dieser Selektor gibt das Zeichenketten-Argument aus, welches
PerformSelector()
als Argument 2 übergeben wird. Es wird
dann die Zeichenfolge "Test return value" an das Hollywood-Skript
zurückgegeben. Sie können diesen Selektor aus Ihrem Hollywood-Skript
wie folgt ausführen:
DebugPrint(PerformSelector("MyTestSelector", "Test")) |
Dieser Code übergibt die Zeichenfolge "Test" an die Methode
MyTestSelector
. Der Befehl DebugPrint() wird "Test return value"
ausgeben, weil das der Rückgabewert von MyTestSelector
ist.
Denken Sie daran, dass Ihre Selektor-Funktion nicht auf dem Main-Thread (UI) laufen wird, sondern auf dem VM-Thread von Hollywood. Wenn Sie also UIKit-Funktionen (oder andere OS-Funktionen, die nur vom Main-Thread ausgeführt werden dürfen) benutzen möchten, dürfen Sie nicht vergessen, den entsprechenden Code zuerst an den Main-Thread zu delegieren.