【问题标题】:Unable to load images from framework in my project无法从我的项目中的框架加载图像
【发布时间】:2018-04-19 19:16:54
【问题描述】:

我的项目结构是这样的,我有 2 个项目,分别命名为 ProjectAProjectB。现在对于这两个项目,我创建了一个名为ProjFramework 的框架。

我已经在框架内添加了这两个项目的公共文件,然后在项目中分别添加了框架。到目前为止,我可以访问所有文件和变量。现在我也在框架中添加了图像,当我尝试在 UI 中显示它们时,我收到一个错误,提示 无法读取此 .png

据我所知,我需要以某种方式包含框架,但我不知道如何。请帮助我分享 b/w 2 XCode 项目的常见图像。

提前致谢。

【问题讨论】:

  • 您是如何将图像添加到框架中的?作为Asset 或只是把你的文件?
  • 现在我将它们保存为 png。
  • 再试一次,将图像添加到projFramework 设置的“构建阶段”->“复制文件”。
  • 能否详细说明步骤。

标签: ios swift xcode image frameworks


【解决方案1】:

@arunjos007' 方法的替代方法是 (a) 创建图像包,然后 (b) 从包中检索。

假设您有一个名为 Kernel 的框架,并且您希望访问两种类型的文件 - cikernelpng

创建捆绑包:

  • 将所有文件/图像移动到桌面上的新文件夹中。随意命名。在我的示例中,我将它们命名为 cikernelsimages

  • 使用 .bundle 扩展名重命名您的文件夹。在我的示例中,它们变成了 cikernels.bundleimages.bundle。您将看到下面的警告...选择“添加”。

  • 将包拖到您的框架项目中。您可以展开捆绑包以查看内容。此外,您还可以添加/删除/编辑捆绑包的内容。

从包中检索文件:

我创建了两个公共函数,一个用于检索文件,一个用于检索图像。它们几乎相同,除了 (a) 返回类型和 (b) 错误处理。 (我可能应该在 UIImage 函数中添加一些 - 但由于我完全控制代码 - 它不会被其他任何人使用 - 这并不重要。)

public func returnImage(_ named:String) -> UIImage {
    let myBundle = Bundle.init(identifier: "com.companyName.frameworkName")
    let imagePath = (myBundle?.path(forResource: "images", ofType: "bundle"))! + "/" + named
    let theImage = UIImage(contentsOfFile: imagePath)
    return theImage!
}

public func returnKernel(_ named:String) -> String {
    let myBundle = Bundle.init(identifier: "com.companyName.frameworkName")
    let kernelPath = (myBundle?.path(forResource: "cikernels", ofType: "bundle"))! + "/" + named + ".cikernel"
    do {
        return try String(contentsOfFile: kernelPath)
    }
    catch let error as NSError {
        return error.description
    }
}

最后一点:标识符在框架目标的General标签中定义。通常它采用 com.companyframework* 的形式。将该行更改为您的。

【讨论】:

  • 如果我们在 images.bundle 中有 Assets.xcassets 我们可以访问 Assets.xcassets 吗?
【解决方案2】:

在构建和分发您的framework 之前,您应该复制您的framework 需要携带的文件。

要复制文件,请点击您的framework project target,转到“Build Phases”标签,您会看到一个名为“Copy Files”的部分。在此处添加您的文件(请参见下面的屏幕截图)

然后构建您的framework project,构建成功后,您的可分发框架将在您的Products文件夹中生成。它看起来像YourFrameworkProjectName.framework

将此文件添加到需要您的框架的其他项目。

注意:如果你只是想通过连接你的框架项目来运行你的项目,你可以通过添加构建依赖来完成。 See StackOverflow question here

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多