[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.