@ka2n

Technology and beer

UIKeyCommandで市販の外付けバーコードリーダーからの入力を受けとる(Swift版)

Bluetoothで接続し、EAN-13やCode128等の一次元バーコードを読み取ることができるバーコードリーダーが市販されているが、それをiOSで扱う方法の一つにUIKeyCommandがあります。

blog.kishikawakatsumi.com

UIKeyCommandの存在は岸川さんのブログで知ったのだけど、Objective-Cの頃に書かれたものでSwiftで書き直してみたコードを残しておく。

$ xcrun swift -version
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
class ViewController: UIViewController {
    override var canBecomeFirstResponder: Bool {
        return true
    }

    override var keyCommands: [UIKeyCommand]? {
        return barcodeReaderEnabled ? self._keyCommands : nil
    }
        
    var barcodeReaderEnabled = true

    private var currentCodes: [String] = []
    
    private var _keyCommands: [UIKeyCommand] = {
        let characters = CharacterSet(
            charactersIn: (UnicodeScalar(0x20)...UnicodeScalar(0x7f))
        ).union(CharacterSet.newlines)
        
        let chars = (0x00...0x7f)
            .map { UnicodeScalar($0) }
            .filter { characters.contains($0) }
        
        return chars.map {
            UIKeyCommand(
                input: String($0),
                modifierFlags: [],
                action: #selector(handleKeyCommand)
            )
        }
    }()
    
    func handleKeyCommand(sender: UIKeyCommand) {
        if sender.input.rangeOfCharacter(from: CharacterSet.newlines)?.isEmpty == false {
            debugPrint(currentCodes.joined())
            currentCodes = []
        } else {
            currentCodes.append(sender.input)
        }
    }
}

ブログ用に改行を多めにしてあります。