首页 > 解决方案 > Xcode 12 中的混合 Swift / Objective-C 项目:为什么 UIImageView.setImage 未知?

问题描述

我刚刚从 Xcode 11 更新到 12,并尝试编译一个使用 Objective-C 和 Swift 5 的现有项目。

这失败了很多错误,说UIImage没有setImage方法:Value of type 'UIImageView' has no member 'setImage'

这很奇怪,因为在 Xcode 11 中这没有任何问题。在 Xcode 12 中创建一个全新的项目时,我遇到了同样的错误,但是将代码更改为可以someImageView.image = ...正常工作。

但是,someImageView.image = ...在我现有的项目中失败了Cannot assign to value: 'image' is a method.

为什么在新项目中编译的相同代码在我现有的项目中会失败?

快速将新图像分配给 UIImageView 的正确方法是什么?


// Fails in Xcode 12 in existing and new project
// Compiles in Xcode 11 in existing project
someImageView.setImage(someImage)   

// ==> `Value of type 'UIImageView' has no member 'setImage'


// Fails in Xcode 12 in existing project
// Compiles in Xcode 12 in new project
someImageView.image = someImage

// ==> Cannot assign to value: 'image' is a method

编辑:

遵循@PhillipMills 的想法,我现在找到了一个UIView实现image()方法的扩展:

@interface UIView( Image )

-(UIImage *) image;
-(void) savePNG:(NSString *)filePath;
-(void) saveJPEG:(NSString *)filePath :(float)quality;

@end

这是在 UIImageView 中处理 PDF 图像的扩展的一部分。另一方面,Swift 版本的UIImageView实现image如下:

open class UIImageView : UIView {
    ...
    open var image: UIImage? // default is nil
}

在 Xcode 11 和 12 中都someImageView.image = ...失败,并且命令单击image无法解决,只显示?.

虽然 Xcode 11 解析someImageView.image()UIImageView,但UIViewXcode 12 中的扩展名也是如此。这是为什么呢?

在 Xcode 11someImageView.setImage(...)中被解析为,UIImageView而在 Xcode 12 中同样失败。

setImage()在 Xcode 11 和 12 中使用 Objectiv-C 中的方法都没有问题。

问题:

标签: iosswiftxcode

解决方案


我很确定您的项目或第 3 方库具有用于导出方法名称图像的 UIView 扩展。我的情况是用于导出 UIView 图像的 image 方法。结果是 imageview.image 正在成为一种方法,并且 swift 会自动为您的 UIImageView 生成方法 setImage。原因?UIImageView 是 UIView 的子类。相信我,开始搜索你项目的每一个角落,仔细检查每个 3rd 方库,尤其是那些不是很流行的库。


推荐阅读