Tôi đã tạo ra lớp sau (phiên bản đặc), heres một tham chiếu đến tập tin đầy đủ https://github.com/cotyembry/CastRemoteNative/blob/7e74dbc56f037cc61241f6ece24a94d8c52abb32/root/ios/CastRemoteNative/NativeMethods.swiftGửi sự kiện để JS từ nhanh chóng hoặc Objective-C
@objc(NativeMethods)
class NativeMethods: RCTEventEmitter {
@objc(sendEventToJSFromJS)
func sendEventToJSFromJS {
self.emitEvent(eventName: "test", body: "bodyTestString")
}
func emitEvent(eventName: String: body: Any) {
self.sendEvent(withName: eventName, body: body)
}
}
này hoạt động hoàn hảo và cháy nghe gọi lại tôi đó là trong mã javascript của tôi khi tôi gọi phương thức emitEvent
như sau, một đoạn thay đổi từ https://github.com/cotyembry/CastRemoteNative/blob/7e74dbc56f037cc61241f6ece24a94d8c52abb32/root/js/Components/ChromecastDevicesModal.js
từ phía javascript
import {
NativeModules,
NativeEventEmitter
} from 'react-native'
//here I bring in the swift class to use inside javascript
var NativeMethods = NativeModules.NativeMethods;
//create an event emitter to use to listen for the native events when they occur
this.eventEmitter = new NativeEventEmitter(NativeMethods);
//listen for the event once it sends
this.subscription = this.eventEmitter.addListener('test', (body) => { console.log('in test event listener callback', body)});
NativeMethods.sendEventToJSFromJS() //call the native method written in swift
tôi chỉ đơn giản có sendEventToJSFromJS
phương pháp gọi trên báo chí nút trong javascript
Một lần nữa, công trình này và console.log('in test event listener callback', body)
công trình mã và chạy về phía javascript
Issue của tôi nơi này không làm việc:
Nếu tôi đã làm như sau trong tập tin nhanh chóng sau khi xác định lớp, điều này sẽ không làm việc:
var nativeMethodsInstance = nativeMethods()
nativeMethodsInstance.sendEventToJSFromSwift()
Tại sao? Vì lỗi sau được ném:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'bridge is not set. This is probably because you've explicitly synthesized the bridge in NativeMethods, even though it's inherited from RCTEventEmitter.'
Vì vậy, khi tạo instance
của NativeMethods, so với ... sự khác biệt là gì?
Để biết thêm thông tin:
Objective-C được cây cầu cùng không đặt vấn đề khi tôi viết những đoạn cùng một đoạn mã trong .h và .m file thay vì trong các tập tin .swift
tôi tìm thấy nơi thông báo lỗi là nhận được in trong mã nguồn gốc, nhưng nó chỉ có biến
_bridge
và đang kiểm tra để xem nếu nó là nil
Các tập tin không có lỗi này xuất phát từ là:
RCTEventEmitter.h
RCTEventEmitter.c
đây là đoạn đầy RCTEventEmitter.c
- (void)sendEventWithName:(NSString *)eventName body:(id)body
{
RCTAssert(_bridge != nil, @"bridge is not set. This is probably because you've "
"explicitly synthesized the bridge in %@, even though it's inherited "
"from RCTEventEmitter.", [self class]);
if (RCT_DEBUG && ![[self supportedEvents] containsObject:eventName]) {
RCTLogError(@"`%@` is not a supported event type for %@. Supported events are: `%@`",
eventName, [self class], [[self supportedEvents] componentsJoinedByString:@"`, `"]);
}
if (_listenerCount > 0) {
[_bridge enqueueJSCall:@"RCTDeviceEventEmitter"
method:@"emit"
args:body ? @[eventName, body] : @[eventName]
completion:NULL];
} else {
RCTLogWarn(@"Sending `%@` with no listeners registered.", eventName);
}
}
đâu giá trị _bridge này được thiết lập và làm thế nào nó được thiết lập để tôi có thể biết, trong trường hợp nó là không làm thế nào để thiết lập nó
tôi tìm thấy những điều sau đây cũng trong RCTEventEmitter.h
@property (nonatomic, weak) RCTBridge *bridge;
Trong lỗi được đưa ra nó đề cập đến cây cầu được thừa hưởng trong RCTEventEmitter, vì vậy đây có thể là một vấn đề với phần weak
đến tài sản bridge
?
Hoặc tôi có cần phải thay đổi chiến lược của mình trong cách tôi làm tất cả điều này cùng nhau không?
Tôi biết nó có thể có được một cái gì đó để làm với tôi không hiểu cặn kẽ về
@synthesize bridge = _bridge;
một phần của mã và tất cả các ngôn ngữ được trộn lẫn trong doesnt giúp ích nhiều cho lol ...
này thực sự khó khăn, vì vậy bất kỳ trợ giúp nào cũng sẽ được đánh giá cao! Cảm ơn rất nhiều vì thời gian của bạn
đây là một liên kết đến các dự án đầy đủ khi mã lịch sử dự án đại diện cho mã từ câu hỏi của tôi ở trên (kể từ khi tôi có kể từ khi thay đổi thực hiện để dự án):
https://github.com/cotyembry/CastRemoteNative/tree/7e74dbc56f037cc61241f6ece24a94d8c52abb32
Tại sao bạn sẽ trộn một appdelegate Objective-C với mã nhanh chóng? –
vì tôi cần nó để hiển thị rootView.bridge (tức là biến cầu) @thibautnoah đến các phần khác trong mã –
bạn có thể sử dụng phiên bản .swift của ứng dụng ủy nhiệm bằng cách điều chỉnh mã tôi đã sử dụng trong AppDelegate.m nhưng từ những gì tôi nhớ, trong Swift nó đã cho tôi những vấn đề trong ngôn ngữ đó với các phương pháp họ đang sử dụng để cho phép tôi có được cây cầu (nhưng nó đã được một thời gian kể từ khi tôi nhìn vào nó) –