首页 > 解决方案 > 无法识别的选择器发送到实例 - 如何修复:从相册加载图片时出错

问题描述

尝试从相册加载图片时出现以下错误,我不知道为什么:无法识别的选择器发送到实例下面是我的代码,下面是我的错误堆栈的一部分:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFNumber 范围]:无法识别的选择器发送到实例 0x60000022d440”***第一次抛出调用堆栈:(0 CoreFoundation 0x000000010efe21e6 __exceptionPreprocess + 294 1 libobjc.A.dylib 0x0001000_10dobj1e9 + 48 2 CoreFoundation 0x000000010f063784 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132 3 CoreFoundation 0x000000010ef64898 ___forwarding_ + 1432 4 CoreFoundation 0x000000010eff5d28 forwarding_prep_1_ + 120 5 CoreImage 0x000000010daecf17 -[CISepiaTone outputImage] + 152

请在下面找到我的源代码:

import UIKit
import CoreImage

class ViewController: UIViewController,  UINavigationControllerDelegate {
    //outlet for image to be filtered
    @IBOutlet weak var imageToFilter: UIImageView!

    //outlet for slider to manipulate intensity as slider is dragged
    @IBOutlet weak var filterIntensity: UISlider!

    //property to store UIImage containing the image selected by user from photo album
    var currentImage: UIImage!

    //context from CoreImage Framework to handle rendering of the image for Wakanda Filter
    var imageContext: CIContext!

    //CoreImage Filter to store filters selected by the user
    var currentImageFilters: CIFilter!

    override func viewDidLoad() {
        super.viewDidLoad()

        //objects of coreContext and coreFilterd
        imageContext = CIContext()
        currentImageFilters = CIFilter(name: "CISepiaTone")

        //title to appear on nav
        title = "Wakanda Filter"
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(importPictureFromAlbum))
    }

    //action to update UI when user increases or decreases intensity
    @IBAction func intensityValueChanged(_ sender: UISlider) {
        processImageWithFilter()
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo  info: [String : Any]) {
        guard let imageSelected = info[UIImagePickerControllerEditedImage] as? UIImage else {
            return
        }

        dismiss(animated: true)

        currentImage = imageSelected

        //setting imported image as value to Filter object then manipulating
        let initialImageForFilters = CIImage(image: currentImage)
        currentImageFilters.setValue(initialImageForFilters, forKey: kCIInputImageKey)

        //calling on method to process the image
        processImageWithFilter()
    }

    func processImageWithFilter(){
        currentImageFilters.setValue(filterIntensity.value, forKey: kCIInputImageKey)
        if let computerGeneratedImage = imageContext.createCGImage(currentImageFilters.outputImage!, from: currentImageFilters.outputImage!.extent){
            let processedImage = UIImage(cgImage: computerGeneratedImage)
            self.imageToFilter.image = processedImage
        }
    }
}

extension ViewController: UIImagePickerControllerDelegate {
    //objective c method to control method for selector how to import picture from album
    @objc func importPictureFromAlbum(){
        //creating an object of UIImagePickerController class (will allow editing of images too by modifying Info.plist
        let imagePicker = UIImagePickerController()

        //allow editing of the image
        imagePicker.allowsEditing = true

        //assigning delegate
        imagePicker.delegate = self

        present(imagePicker, animated: true)
    }
}

标签: iosswiftcore-imageunrecognized-selector

解决方案


过滤器CISepiaTone需要两个参数:

inputImage:一个 CIImage 对象,其显示名称为 Image。

inputIntensity:一个 NSNumber 对象,其属性类型为 CIAttributeTypeScalar,显示名称为 Intensity。

您的错误来自这一行:

currentImageFilters.setValue(filterIntensity.value, forKey: kCIInputImageKey)

将值更改为图像或将键更改为kCIInputIntensityKey.

鉴于您之前设置了图像,您可能希望更改此行的键。

currentImageFilters.setValue(filterIntensity.value, forKey: kCIInputIntensityKey)

推荐阅读