我已经在Swift中使用UIButton编写了自定义UIView,并将其桥接以响应本机应用程序。视图显示正确。现在我想在按钮点击时发出事件以反应原生的javascript端。我怎样才能做到这一点?
- 编辑 -
我无法发出事件,因为var bridge: RCTBridge!
始终为空。
答案 0 :(得分:0)
如果您通过Xcode文件>新文件菜单选项将Swift文件添加到您的应用程序。您需要在此标头文件中导入RCTBridgeModule.h
。
// CalendarManager-Bridging-Header.h
#import "RCTBridgeModule.h"
如果你看一下facebook的例子,那就很简单了。
//create your class
@objc(CalendarManager)
class CalendarManager: NSObject {
@objc func addEvent(name: String, location: String, date: NSNumber) -> Void {
// Date is ready to use!
}
}
@objc用于确保在运行时正确导出所有内容
然后用目标c代码创建一个单独的.m文件,你必须混合这两个。记住swift不支持宏。要导出它,只需将函数包装在RCT_EXTERN_METHOD
宏中,您就可以轻松使用事件调度程序
// CalendarManagerBridge.m
#import "RCTBridgeModule.h"
@interface RCT_EXTERN_MODULE(CalendarManager, NSObject)
RCT_EXTERN_METHOD(addEvent:(NSString *)name location:(NSString *)location date:(nonnull NSNumber *)date)
//throw in the event dispatcher if you want
@end
看看这些链接,它将引导您完成整个过程
https://facebook.github.io/react-native/docs/native-modules-ios.html#content
https://colinramsay.co.uk/2015/07/04/react-native-eventemitters.html
答案 1 :(得分:0)
我遇到了同样的问题,下面是我如何解决问题。
Official document与我们的实现略有不同,它只定义ViewManager
以将方法和变量公开给js
,但我们将ViewManager
定义为返回UIView
,我们希望从此UIView
返回方法和变量。
RCTBridge *bridge
桥包含在RCTViewManager中,但请记住我们的ViewManager
继承了RCTViewManager
类,因此我们仍然可以访问bridge
,我们可以通过{{1}从bridge
到ViewManager
。
以下是我们如何访问UIView
:
bridge
CustomUIButtonViewManager.swift
和我们的import Foundation
@objc(CustomUIButtonViewManager)
class CustomUIButtonViewManager : RCTViewManager {
var customButtonView:CustomButtonView!
override func view() -> UIView! {
customButtonView = CustomButtonView(bridge: self.bridge)
return customButtonView
}
}
,如下所示定义:
CustomButtonView.swift
现在您可以访问此UIView中的import UIKit
class CustomButtonView: UIView {
var bridge: RCTBridge!
init(bridge: RCTBridge!) {
this.bridge = bridge
//So you have saved the bridge in this View
}
变量。
这就是我解决这个问题的方法,希望对你有所帮助。