我有一个在Swift中创建的macOS应用程序,我集成了一个外部HID设备,上面有很多控件。HID部分是在我从设备接收所有隐藏命令的地方完成的,我试图创建一个映射文件,在那里我可以在一个单独的swift文件中维护HID密钥映射。我只想在那个文件中保存数据,我想做的就是这样;
- 从hid设备接收原始隐藏数据(在ViewController中(
- 查找分配给此隐藏数据的函数名(在单独的文件中(
- 运行映射到该键的函数。(函数位于主ViewController中(
到目前为止,我已经用所有映射设置了外部swift文件,一切都很好,但我的问题是,当我试图调用ViewController中的查找函数时,它说在作用域中找不到该函数。
起初我想我会使用委托,但外部文件不是视图控制器,只是一个单独的swift文件,所以我不知道我是否能做到这一点?。
我试过搜索,但我找到的都是从另一个ViewController调用函数,而我不是。很可能我没有使用最好的方法,我的目标是将所有映射保存在一个单独的文件中,因为有很多映射,而且更容易维护。
欢迎提出任何建议。
这是实现这一目标的一种方法。它可能会变得乏味。您可以完全跳过为代理编写单独的协议,但这是一种更干净的设计。
protocol HIDMessageDelegate: AnyObject {
// example messages
func message1()
func message2()
func message3()
}
class HIDMessageParser {
static weak var delegate: HIDMessageDelegate?
static func parseHIDMessage() {
var condition = 0
// this is where your switch statement will go and you'll parse things and call the relevant delegate method
switch (condition) {
default:
delegate?.message1()
}
}
}
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
HIDMessageParser.delegate = self
}
}
extension MyViewController: HIDMessageDelegate {
func message1() {
}
func message2() {
}
func message3() {
}
}
您可以简单地创建一个UIViewController作为外部文件,并将其作为属性添加到主ViewController中。
在外部文件中添加此。
@IBOutlet var uiViewController: UIViewController!
在ViewController中添加此。
var externalFileViewController: UIViewController!
override func viewDidLoad() {
super.viewDidLoad()
externalFileViewController = externalFileViewController?.loadView()
// If we have an object then load it
if let viewController = externalFileViewController {
viewController.view.frame = view.frame
viewController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
view.addSubview(viewController.view)
uiViewController = viewController
}
}
现在,在viewController中,从外部文件中查找要调用的函数,并使用函数名进行调用。
这些函数是使用@IBAction在外部文件中定义的。
如果你有任何问题,请告诉我。