首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将ACSSmartCardIO和SmartCardIO集成到SwiftUI项目中

将ACSSmartCardIO和SmartCardIO集成到SwiftUI项目中
EN

Stack Overflow用户
提问于 2021-08-08 10:14:32
回答 1查看 72关注 0票数 0

我面临的问题是,我希望将以下框架集成到一个SwiftUI项目中,即: ACSSmartCardIO & SmartCardIO

我不精通SwiftUI或iOS开发,无法理解如何在SwiftUI中实现和使用委托。

文档显示:在连接蓝牙卡终端之前,您的应用程序必须导入ACSSmartCardIO模块。您可以从BluetoothSmartCard.shared对象中获取蓝牙终端管理器和终端工厂的实例。若要从BluetoothTerminalManager对象接收事件,您的应用程序必须为其分配一个委托对象。

代码语言:javascript
代码运行次数:0
运行
复制
...

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设备上使用蓝牙时显示消息。

代码语言:javascript
代码运行次数:0
运行
复制
// 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:)方法。

代码语言:javascript
代码运行次数:0
运行
复制
...

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
        }
    }
}

...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-08 13:24:21

您的代码与UI几乎没有关系。只有在直接处理用户交互时,SwiftUI才重要。

将此代码应用于SwiftUI设置的一种简单方法是将UIViewController中的所有代码放在一个ViewModel中,该ObservableObject是一个ObservableObject

替换

代码语言:javascript
代码运行次数:0
运行
复制
class ViewController: UIViewController {

使用

代码语言:javascript
代码运行次数:0
运行
复制
class BluetoothSmartCardViewModel: ObservableObject {

代码语言:javascript
代码运行次数:0
运行
复制
extension ViewController: BluetoothTerminalManagerDelegate {

使用

代码语言:javascript
代码运行次数:0
运行
复制
extension BluetoothSmartCardViewModel: BluetoothTerminalManagerDelegate {

对于任何UIKit代码,如IBActionIBOutlet和任何viewDid...方法,都会出现一些错误。您将不得不创建@Published变量和func来补偿那些与SwiftUI View和Storyboard交互的变量。

segue代码而言,这似乎是“最棘手”的部分。有几种方法可以处理这个问题。

一种方法是使用ScanTerminalsView

代码语言:javascript
代码运行次数:0
运行
复制
.onAppear(){
    viewModel.manager.startScan(terminalType: .amr220c)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68699789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档