加载用户图像适用于模拟器,但不适用于 iphone xcode 6 Swift

Posted

技术标签:

【中文标题】加载用户图像适用于模拟器,但不适用于 iphone xcode 6 Swift【英文标题】:loading user images works in simulator but not on the iphone xcode 6 Swift 【发布时间】:2015-01-12 15:45:26 【问题描述】:

我正在尝试在我的应用程序中加载(和上传)图像(通过图片路径)。 这在我的模拟器中工作。一切正常。仅当我尝试在 iphone 本身上执行此操作时,它才会起作用,并且我只看到空的 UIImageviews。

路径的加载方式与模拟器中的相同。并且起源于:

  PHImageManager.defaultManager().requestImageDataForAsset(asset, options: nil)
            
                imageData,dataUTI,orientation,info in

                cell.setString(info["PHImageFileSandboxExtensionTokenKey"] as String,name:dataUTI as String)
             

并且PHImageFileSandboxExtentionTokenKey在加载图片时被拆分为数据和url。 这导致模拟器为:

/Users/Twizzler/Library/Developer/CoreSimulator/Devices/3E671415-8B83-44DA-870F-19BF2BC11F8F/data/Containers/Data/Application/8872109F-3784-40EB-BEB6-4E9FDABE013D/Documents/1613945_10200645161051698_4122753901212984922_n.jpg

在 iphone 中为:

/private/var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG

我像这样加载图像:

  let image = UIImage(named: "/private/var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG")
        cell.imageView.image = image

在这种情况下,我将图像 url 硬编码(这是最终应用程序中的图像数组)

我没有收到错误或堆栈跟踪。放置断点时,我看到图像信息的方式与模拟器相同

正如答案所建议的那样,我现在尝试按如下方式加载它们:

 let image = UIImage(contentsOfFile: "/private/var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG")
        cell.imageView.image = image

这不起作用,我无法上传文件

【问题讨论】:

应用是沙盒的。在真实(未越狱)设备上,应用无法直接访问其沙盒之外的任何文件。 路径/private/var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG不可直接访问。它看起来像一个ALAssets URL。您应该始终在您的应用沙箱中复制和使用图像。 好吧,我如何在我的沙箱中获取图像?(我知道这是一个愚蠢的问题。但我只能找到那些使用我现在拥有它的方式) Determining Where to Store Your App-Specific Files 我尝试使用的文件不是特定于应用程序的 【参考方案1】:

imageNamed 不是这样工作的——正如文档所述,它在您的应用程序包中查找具有给定名称的图像。试试imageWithContentsOfFile

【讨论】:

它不起作用仍然是同样的错误。问题是我无法让用户拍摄的照片(相机胶卷)显示并且无法将它们上传到服务器【参考方案2】:

好吧,我修好了!经过一些令人费解的日子后,我现在使用这种方式访问​​上传和 cell.imageView.image = UIImage(data: array[indexPath.row][0] as NSData) 这显示了图像。我可以将 NSData 保存在 CoreData 中并以这种方式重新加载图像。

使用这个来减轻系统的负载:

cellData.checked = 1
            var imageData = UIImageJPEGRepresentation(cell.imageView.image, 1)
            self.array.append([imageData,cellData.imageData] )

            let myObj : ViewControllerImagePicker = self.parentViewController as ViewControllerImagePicker
            let textfield: UILabel = myObj.amountLabel! as UILabel
            textfield.text = String(self.array.count )
            cell.textLabel.alpha = 1

单击单元格时将调用此代码。通过设置 cellData.imageData 我可以调用单元格(单击返回集合视图时)

由于数据使用问题,我不知道我这样做的方式是否正确或使用超过 10 个文件。但在我的情况下,最多选择 6 张图片,它就像一个魅力

【讨论】:

【参考方案3】:

在文件、应用程序包和沙盒方面,模拟器的工作方式与真实设备完全不同。

对于初学者,模拟器可以让您在应用程序包中写入、添加或更改文件。在真实设备上运行的 ios 不允许您这样做。

您不能对应用中的任何路径进行硬编码。即使它今天可以工作或在您的设备上处于测试模式,但这并不意味着它可以在已发布的版本上工作。即使这样做,它也可能停止进行任何更新。苹果几次改变了存储东西的位置和手机中的路径结构。以及你可以写的地方。

进行捆绑调用以获取标准文件夹的路径位置。

使用资源库从照片库加载图像,或将它们保存在那里。

网上有大量关于如何做到这一点的资源和教程。

【讨论】:

以上是关于加载用户图像适用于模拟器,但不适用于 iphone xcode 6 Swift的主要内容,如果未能解决你的问题,请参考以下文章

screenShot代码不适用于ipad,适用于iphone

iOS 项目适用于 iPhone,但不适用于模拟器

应用程序适用于 iphone ipad 模拟器但不适用于 ipad 设备:黑屏然后熄灭

iOS 8 代码适用于 iPhone 5s 但不适用于 iPhone 5

Swift pushViewController 适用于 iPad 但不适用于 iPhone

AVPlayerViewController 视频适用于 iOS 11、12,但不适用于 iPhone 11 的 iOS 13