Heim >Web-Frontend >js-Tutorial >Ausführliche Erläuterung von Beispielen zur Intermodulation zwischen JS und OC
1. JavaScriptKern häufig verwendete Klassen
JavaScriptCore-Funktion: JavaScriptCore ist Apples native API, die für JS und verwendet wird OC interaktiv.
JSContext: JS-Laufumgebung, verwenden Sie sie zum Ausführen von JS-Code und zum Abrufen von Daten in JS
JSValue: wird zum Empfangen des in JS erhaltenen Datentyps verwendet, der ein beliebiges Objekt sein kann , Methode.
Wesentlich: Variablen und Methoden wurden im JS-Code definiert, erhalten Sie sie über OC und rufen Sie
auf. Schritte:
1. JS-Laufumgebung erstellen
2. JS-Code ausführen
3. JS-Daten abrufen (Variablen, Methoden)
4. JS-Daten und Methoden verwenden
2.1 In JS definierte Variablen abrufen
Sie können den Wert von Variablen in JS direkt über OC ändern
#pragma mark - 获取JS中定义的变量 - (void)getJSVar{ // JS代码 NSString *jsCode = @"var arr = [1,2,3]"; // 创建JS运行环境 JSContext *ctx = [[JSContext alloc] init]; // 执行JS代码 [ctx evaluateScript:jsCode]; // 因为变量直接定义在JS中,所以可以直接通过JSContext获取,根据变量名称获取,相当于字典的Key // 只有先执行JS代码,才能获取变量 JSValue *jsArr = ctx[@"arr"]; jsArr[0] = @5; // 打印结果:5,2,3 NSLog(@"%@",jsArr);}
2.2 In JS definierte Methoden abrufen und Rufen Sie
auf, um die OC-Aufruf-JS-Methode
#pragma mark - OC调用JS // OC调用JS方法,并获取返回结果 - (void)ocCallJSFunc{ NSString *jsCode =@"function hello(say){" " return say; " "}"; // 创建JS运行环境 JSContext *ctx = [[JSContext alloc] init]; // 因为方法直接定义在JS中,所以可以直接通过JSContext获取,根据方法名称获取,相当于字典的Key // 执行JS代码 [ctx evaluateScript:jsCode]; // 获取JS方法,只有先执行JS代码,才能获取 JSValue *hello = ctx[@"hello"]; // OC调用JS方法,获取方法返回值 JSValue *result = [hello callWithArguments:@[@"你好"]]; // 打印结果:你好 NSLog(@"%@",result); }
in OC: So etwas gibt es nicht in JS am Anfang des OC-Blocks, sodass Sie den OC-Block nicht direkt aufrufen können. Sie müssen die OC-Blockmethode in JS generieren und sie dann über JS aufrufen.
Schritte:
1. Erstellen Sie eine JS-Laufumgebung
2. Verwenden Sie JS, um in JS aufzurufen Die in der Umgebung generierte Blockmethode kann im OC-Block aufgerufen werden.
3.1 JS ruft den Block ohne Parameter in OC auf
Sie möchten den Block ohne Parameter in OC über JS aufrufen
#pragma mark - JS调用OC中不带参数的block - (void)jsCallOCBlock1WithNoneArguments{ // 创建JS运行环境 JSContext *ctx = [[JSContext alloc] init]; // JS调用Block方式// 由于JS本身没有OC这个代码,需要给JS中赋值,就会自动生成右边的代码. // 相当于在JS中定义一个叫eat的方法,eat的实现就是block中的实现,只要调用eat,就会调用block ctx[@"eat"] = ^(){NSLog(@"吃东西"); }; // JS执行代码,就会直接调用到block中 NSString*jsCode =@"eat()"; [ctx evaluateScript:jsCode];}3.2 JS ruft den Block mit Parametern in OC auf
Ich möchte den Block mit Parametern in OC über JS aufrufen
- (void)jsCallOCBlockWithArguments{ // 创建JS运行环境 JSContext *ctx = [[JSContext alloc] init]; // 2.调用带有参数的block // 还是一样的写法,会在JS中生成eat方法,只不过通过[JSContext currentArguments]获取JS执行方法时的参数 ctx[@"eat"] = ^(){ // 获取JS调用参数 NSArray *arguments = [JSContext currentArguments]; NSLog(@"吃%@",arguments[0]); }; // JS执行代码,调用eat方法,并传入参数面包 NSString*jsCode =@"eat('面包')"; [ctx evaluateScript:jsCode]; }4. JS ruft Klassen in OC auf
Schritte
1. Die OC-Klasse muss dem JSExport-Protokoll entsprechen, JS generiert diese Klasse
2 reicht nicht aus, es gibt Attribute und Methoden
müssen auch in JS generiert werden JSExport und verwenden Sie es in Ihrem eigenen Protokoll. Legen Sie die Attribute und Methoden offen, die in JS verwendet werden müssen.4.1 JS ruft benutzerdefinierte OC-Klasse aufBenutzerdefiniertes Protokoll (PersonJSExport)
Benutzerdefinierte Klasse (Person)@protocolPersonJSExport @property(nonatomic, strong) NSString *name; -(void)play; // 调用多个参数的方法,JS函数命名规则和OC还不一样,很可能调用不到对应的JS生成的函数,为了保证生成的JS函数和OC方法名一致,OC提供了一个宏JSExportAs,用来告诉JS应该生成什么样的函数对应OC的方法,这样就不会调错了。 // PropertyName:JS函数生成的名字 // Selector:OC方法名 // JS就会自动生成playGame这个方法JSExportAs(playGame, - (void)playWithGame:(NSString *)gametime:(NSString *)time); @end
Benutzerdefinierte OC-Klassen über JS aufrufen@interfacePerson: NSObject @property(nonatomic, strong) NSString *name; -(void)playWithGame:(NSString*)gametime:(NSString*)time; @end @implementationPerson -(void)play{ NSLog(@"%@玩",_name); } -(void)playWithGame:(NSString*)gametime:(NSString*)time{ NSLog(@"%@在%@玩%@",_name,time,game); } @end
4.1 JS-Aufruf OC-SystemklassenProblem: Klassen, die mit dem System geliefert werden. Was sollen wir tun, wenn wir sie über JS aufrufen möchten? Wir können die Dateien der systemeigenen Klassen nicht ändern. Nur Wie beim Aufrufen einer benutzerdefinierten Klasse müssen wir auch ein benutzerdefiniertes Protokoll erstellen, um JSExport zu erben und zu beschreiben, welche Attribute verfügbar gemacht werden müssen (denken Sie daran, welche Attribute der Systemklasse verfügbar gemacht werden sollen, deklarieren Sie sie in Ihrem eigenen Protokoll) Hinzufügen ein Protokoll für die Klasse zur Laufzeit Benutzerdefiniertes Protokoll (UILabelJSExport)#pragmamark - JS调用OC自定义类 - (void)jsCallOCCustomClass{ // 创建Person对象 Person *p = [[Person alloc] init]; p.name = @"zs"; JSContext *ctx = [[JSContext alloc] init]; // 会在JS中生成Person对象,并且拥有所有值 // 前提:Person对象必须遵守JSExport协议, ctx[@"person"] = p; // 执行JS代码 // 注意:这里的person一定要跟上面声明的一样,因为生成的对象是用person引用// NSString *jsCode = @"person.play()"; NSString *jsCode = @"person.playGame('德州扑克','晚上')"; [ctx evaluateScript:jsCode]; }
JS ruft OC-Systemklassen auf@protocolUILabelJSExport @property(nonatomic, strong) NSString *text; @end
[Verwandte Empfehlungen]1.#pragma mark - JS调用OC系统类 - (void)jsCallOCSystemClass{ // 给系统类添加协议 class_addProtocol([UILabel class], @protocol(UILabelJSExport)); // 创建UILabel UILabel *label= [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; [self.view addSubview:label]; JSContext *ctx = [[JSContext alloc] init]; // 就会在JS中生成label对象,并且用laebl引用 ctx[@"label"] =label; // 利用JS给label设置文本内容 NSString *jsCode = @"label.text = 'Oh Year'"; [ctx evaluateScript:jsCode]; }
Kostenloses JS-Online-Video-Tutorial
2. JavaScript Chinese Reference Manual
3. php.cn Dugu Jiujian (3) – JavaScript-Video-Tutorial
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen zur Intermodulation zwischen JS und OC. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!