Swift : No Matter what I do CIDetector is always n

2019-02-11 08:22发布

i don't understand why this code doesn't work, the detector is always nil with the CIDetectorTypeQRCode constant, everything work with CIDetectorTypeFace. I Supect a bug from API of Apple. This a the official doc : Apple documentation

@IBAction func analyseTag(sender: AnyObject) {

        var detector:CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context:nil, options:[CIDetectorAccuracy: CIDetectorAccuracyHigh])
        var decode = ""
        var ciImage:CIImage = CIImage(image: ImgChoosed.image)
        var message:String = "";

        let features = detector.featuresInImage(ciImage)
        for feature in features as [CIQRCodeFeature] {
            message += feature.messageString
        }

        if(message == "") {
            println("nothing")

        } else {
            println("\(message)")
        }



    }

Have you a solution? Thank in advance guy's

4条回答
放我归山
2楼-- · 2019-02-11 08:31
  1. Make sure your ImgChoosed.image is not nil.
  2. Change another input image for testing.
  3. Try for feature in features as! [CIQRCodeFeature].
查看更多
爷的心禁止访问
3楼-- · 2019-02-11 08:35

I found that using on a device resolved this issue. The simulator seemed to always return nil for me.

查看更多
男人必须洒脱
4楼-- · 2019-02-11 08:40

This happened to us as well. iPhone 4s doesn't return a CIDetector of type QRCode. The other types (rectangle, face) work though…

The same code works as expected on the iPhone 6. Haven't tested on a 5 or 5s yet.

But two weeks ago it was still working on the 4s, I believe. It was still on iOS 8 back then, I guess.

查看更多
孤傲高冷的网名
5楼-- · 2019-02-11 08:41

The code you provided can't have a nil detector because it's not an optional and the compiler would complain about several places in your code if it was.

If features is empty then you know it didn't find a QR code in your image. Try providing a better image or turning down the CIDetectorAccuracy.

If features isn't empty then your cast is failing.

Edit: You can't pass a nil context in the constructor.

查看更多
登录 后发表回答