Swift 3 - сгенерированный QR-код UIImage для прикрепления к электронной почте, но я получаю сообщение об ошибке nil при развертывании необязательного значения

У меня работает генератор QR-кода, он отображает изображение на моем qrImageView UIImageView.

Теперь я хочу прикрепить изображение QR-кода к электронному письму. Пробовал код, указанный ниже, но получаю сообщение об ошибке «при распаковке необязательного значения найдено nil».

Пожалуйста помоги!

Функция создания QR-кода

  func generateQRCode(from string:String) -> UIImage? {

    let data =  string.data(using: String.Encoding.isoLatin1)

    if let filter = CIFilter(name:"CIQRCodeGenerator") {
        filter.setValue(data, forKey: "inputMessage")
        let transform = CGAffineTransform(scaleX: 100, y: 100)

        if let output = filter.outputImage?.applying(transform) {
            return UIImage(ciImage: output)
        }
    }
    return nil
}

@IBAction func generateAction(_ sender: Any) {

    if let actualText = qrCodeTextField.text {
        let image = generateQRCode(from: actualText)
        qrImageView.image = image
    }



}

Код для прикрепления QR-кода к электронному письму

func configureMailController() -> MFMailComposeViewController {
    let mailComposerVC = MFMailComposeViewController()

    mailComposerVC.mailComposeDelegate = self

    mailComposerVC.setToRecipients(["[email protected]"])
    mailComposerVC.setSubject("\(subject) QR Code")
    mailComposerVC.setMessageBody("Please see attached QR Code", isHTML: false)

    //Add Image as Attachment

    if let image = qrImageView.image {
        let data: NSData = UIImagePNGRepresentation(image)! as NSData

        mailComposerVC.addAttachmentData(data as Data, mimeType: "image/png", fileName: "image")

    }


    return mailComposerVC

}

person TSM    schedule 04.08.2017    source источник


Ответы (2)


Это работает для меня. Сначала мне нужно преобразовать CIImage в UIImage, чтобы QRCode можно было прикрепить к электронной почте.

func convert(cmage:CIImage) -> UIImage
{       
    let context:CIContext = CIContext.init(options: nil)
    let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!        
    let image:UIImage = UIImage.init(cgImage: cgImage)        
    return image
}

Источник: Невозможно преобразовать CIImage в UIImage в Swift 3.0< /а>

person TSM    schedule 04.08.2017

Попробуй это,

if let image = qrImageView.image { 
    let data = UIImagePNGRepresentation(image) as NSData?
}

Вместо

if let image = qrImageView.image {
    let data = UIImagePNGRepresentation(image)! as NSData
}

Кажется, что это единственная часть кода, которая принудительно разворачивает значение.

person Kiester    schedule 04.08.2017
comment
Привет. Спасибо за ваш ответ. Я попробовал это, и я все еще получаю ту же ошибку. Кажется, что он не может найти какое-либо значение внутри qrImageView.image, даже если в настоящее время он отображает изображение QRCode. - person TSM; 04.08.2017
comment
Я считаю, что это строка кода, которая выдает ошибку. Это происходит всякий раз, когда я нажимаю кнопку отправки электронной почты. Я пробовал этот код *** if let image = qrImageView.image { if let data = UIImagePNGRepresentation(image) { mailComposerVC.addAttachmentData(data, mimeType: image/png, fileName: image) } } *** и страницу электронной почты отображается, но не содержит никаких вложений, только тему, получателя и тело сообщения - person TSM; 04.08.2017