我面临的问题是,我希望将以下框架集成到一个SwiftUI项目中,即: ACSSmartCardIO & SmartCardIO
我不精通SwiftUI或iOS开发,无法理解如何在SwiftUI中实现和使用委托。
文档显示:在连接蓝牙卡终端之前,您的应用程序必须导入ACSSmartCardIO模块。您可以从BluetoothSmartCard.shared对象中获取蓝牙终端管理器和终端工厂的实例。若要从BluetoothTerminalManager对象接收事件,您的应用程序必须为其分配一个委托对象。
...
import SmartCardIO
import ACSSmartCardIO
...
class ViewController: UIViewController {
...
let manager = BluetoothSmartCard.shared.manager
let factory = BluetoothSmartCard.shared.factory
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
...
// Set the delegate.
manager.delegate = self
...
}
...
}
...
你的应用程序必须从CentralManager对象检查状态,并在不支持蓝牙或其他原因导致你的应用程序无法在你的iOS设备上使用蓝牙时显示消息。
// MARK: - BluetoothTerminalManagerDelegate
extension ViewController: BluetoothTerminalManagerDelegate {
func bluetoothTerminalManagerDidUpdateState(_ manager: BluetoothTerminalManager) {
var message = ""
switch manager.centralManager.state {
case .unknown, .resetting:
message = "The update is being started. Please wait until Bluetooth is ready."
case .unsupported:
message = "This device does not support Bluetooth low energy."
case .unauthorized:
message = "This app is not authorized to use Bluetooth low energy."
case .poweredOff:
if !firstRun {
message = "You must turn on Bluetooth in Settings in order to use the reader."
}
default:
break
}
if !message.isEmpty {
// TODO: Show the message.
// ...
}
firstRun = false
}
...
}
要查找BLE卡终端,必须在BluetoothTerminalManager对象中使用BluetoothTerminalManager.startScan(terminalType:)方法。
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier {
switch identifier {
case "ScanTerminals":
...
// Start the scan.
manager.startScan(terminalType: .amr220c)
...
default:
break
}
}
}
...
发布于 2021-08-08 13:24:21
您的代码与UI几乎没有关系。只有在直接处理用户交互时,SwiftUI才重要。
将此代码应用于SwiftUI设置的一种简单方法是将UIViewController
中的所有代码放在一个ViewModel中,该ObservableObject
是一个ObservableObject
。
替换
class ViewController: UIViewController {
使用
class BluetoothSmartCardViewModel: ObservableObject {
和
extension ViewController: BluetoothTerminalManagerDelegate {
使用
extension BluetoothSmartCardViewModel: BluetoothTerminalManagerDelegate {
对于任何UIKit代码,如IBAction
、IBOutlet
和任何viewDid...
方法,都会出现一些错误。您将不得不创建@Published
变量和func
来补偿那些与SwiftUI View
和Storyboard交互的变量。
就segue
代码而言,这似乎是“最棘手”的部分。有几种方法可以处理这个问题。
一种方法是使用ScanTerminalsView
和
.onAppear(){
viewModel.manager.startScan(terminalType: .amr220c)
}
https://stackoverflow.com/questions/68699789
复制相似问题