加载用户图像适用于模拟器,但不适用于 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
应用程序适用于 iphone ipad 模拟器但不适用于 ipad 设备:黑屏然后熄灭
iOS 8 代码适用于 iPhone 5s 但不适用于 iPhone 5
Swift pushViewController 适用于 iPad 但不适用于 iPhone
AVPlayerViewController 视频适用于 iOS 11、12,但不适用于 iPhone 11 的 iOS 13