ios - 无法识别的选择器发送到实例 - 如何修复:从相册加载图片时出错
问题描述
尝试从相册加载图片时出现以下错误,我不知道为什么:无法识别的选择器发送到实例下面是我的代码,下面是我的错误堆栈的一部分:
由于未捕获的异常“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)
}
}
解决方案
过滤器CISepiaTone
需要两个参数:
inputImage:一个 CIImage 对象,其显示名称为 Image。
inputIntensity:一个 NSNumber 对象,其属性类型为 CIAttributeTypeScalar,显示名称为 Intensity。
您的错误来自这一行:
currentImageFilters.setValue(filterIntensity.value, forKey: kCIInputImageKey)
将值更改为图像或将键更改为kCIInputIntensityKey
.
鉴于您之前设置了图像,您可能希望更改此行的键。
currentImageFilters.setValue(filterIntensity.value, forKey: kCIInputIntensityKey)
推荐阅读
- swift - 如何与 siwft 4 共享生成的 UIImage
- c++ - 注入一个 QTimer 的模拟
- php - 我们可以使用 mysqli_real_escape_string 来防止搜索表单中的 SQLinjection 吗?
- python - 计算不平衡的 4D numpy 数组中的元素数
- java - Java Spring SOAP Webservice 中的 JBoss (Wildfly) max-post-size 句柄响应
- reactjs - Reducer 正在接收参数但什么也没做 ReactJS
- reactjs - PropTypes:PropTypes.array VS PropTypes.arrayOf(PropTypes.any)
- c++ - 使用 gnuPlot 在 C++ 中进行实时绘图
- python - 如何以迭代的方式用熊猫平均单个列中的两个值?
- html - 为什么空显示内联块元素创建高度但显示内联和显示块不?