Heim > Web-Frontend > js-Tutorial > Hauptteil

Ausführliche Erläuterung von Beispielen zur Intermodulation zwischen JS und OC

零下一度
Freigeben: 2017-05-10 11:06:10
Original
1535 Leute haben es durchsucht

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.

2. OC ruft JS auf

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);}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

zu realisieren. 3. Die Essenz des JS-Aufrufblocks

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];}
Nach dem Login kopieren
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];
}
Nach dem Login kopieren
4. JS ruft Klassen in OC auf

Es gibt keine OC-Klassen in JS. Sie müssen zuerst OC-Klassen in JS generieren und diese dann über JS aufrufen.

Schritte

1. Die OC-Klasse muss dem JSExport-Protokoll entsprechen, JS generiert diese Klasse

2 reicht nicht aus, es gibt <🎜 in der Klasse >Attribute und Methoden

müssen auch in JS generiert werden

3. JSExport selbst verfügt nicht über eigene Attribute und Methoden, daher müssen Sie ein Protokoll anpassen . Erben Sie

JSExport und verwenden Sie es in Ihrem eigenen Protokoll. Legen Sie die Attribute und Methoden offen, die in JS verwendet werden müssen.

4 Auf diese Weise muss Ihre Klasse nur ihr eigenes Protokoll erben. und JS generiert automatisch die Klasse, einschließlich der in seinem eigenen Protokoll deklarierten Attribute und Methoden

4.1 JS ruft benutzerdefinierte OC-Klasse auf

Benutzerdefiniertes 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
Nach dem Login kopieren

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
Nach dem Login kopieren

4.1 JS-Aufruf OC-Systemklassen
#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(&#39;德州扑克&#39;,&#39;晚上&#39;)"; 
  [ctx evaluateScript:jsCode];
}
Nach dem Login kopieren
Problem: 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)

JS ruft OC-Systemklassen auf
@protocolUILabelJSExport
@property(nonatomic, strong) NSString *text;
@end
Nach dem Login kopieren

[Verwandte Empfehlungen]
#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 = &#39;Oh Year&#39;"; 
  [ctx evaluateScript:jsCode];
}
Nach dem Login kopieren
1.

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!