适配Xcode15升级Kingfisher后,UIImageView的setImage方法报错
问题
为适配Xcode 15.0升级Kingfisher库后,调用UIImageView的kf.setImage方法时出现报错:No exact matches in call to instance method 'setImage'。
相关代码如下:
func setImage(fromURL url: String?, dominantColor: String? = "", placeholder: UIImage? = nil) { if let urlString = url, let url = URL(string: urlString) { var placeHolder = placeholder // Create the resource directly from the URL as a string let resource = ImageResource(name: urlString, bundle: Bundle.main) if let dominantColor = dominantColor, dominantColor.count > 0 { // Replace the following line with your color conversion code if needed self.backgroundColor = UIColor.white } else { placeHolder = UIImage(named: "placeholder") } // Use the setImage method from Kingfisher directly on the UIImageView self.kf.setImage(with: resource, placeholder: placeHolder, options: nil, completionHandler: { _ in self.backgroundColor = UIColor.white }) } else { self.image = UIImage(named: "placeholder") } }
报错集中在这段代码:
self.kf.setImage(with: resource, placeholder: placeHolder, options: nil, completionHandler: { _ in self.backgroundColor = UIColor.white })
解决思路与修复方案
Kingfisher新版本调整了setImage方法的参数规则,同时你代码里创建ImageResource的逻辑也有误,具体修复点如下:
- 参数适配:新版
options不再接受nil,需传入空数组[]或具体配置项; - 资源初始化错误:网络图片不能用本地资源的
ImageResource(name:bundle:)初始化,应该用ImageResource(downloadURL:)直接传入网络URL。
修复后的完整代码:
func setImage(fromURL url: String?, dominantColor: String? = "", placeholder: UIImage? = nil) { if let urlString = url, let url = URL(string: urlString) { var placeHolder = placeholder // 网络图片用URL初始化ImageResource,无需指定bundle let resource = ImageResource(downloadURL: url) if let dominantColor = dominantColor, dominantColor.count > 0 { self.backgroundColor = UIColor.white } else { placeHolder = UIImage(named: "placeholder") } // 适配新版Kingfisher参数:options传入空数组替代nil,匹配方法签名 self.kf.setImage(with: resource, placeholder: placeHolder, options: []) { _ in self.backgroundColor = UIColor.white } } else { self.image = UIImage(named: "placeholder") } }
额外提示:
如果需要配置图片加载规则(比如缓存策略、动画选项),直接在options数组中添加对应的KingfisherOptionsInfoItem即可,例如.cacheOriginalImage。
内容的提问来源于stack exchange,提问作者Muhammad Rehan
相关产品推荐
相关产品推荐

