【问题标题】:loading user images works in simulator but not on the iphone xcode 6 Swift加载用户图像适用于模拟器,但不适用于 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。您应该始终在您的应用沙箱中复制和使用图像。
  • 好吧,我如何在我的沙箱中获取图像?(我知道这是一个愚蠢的问题。但我只能找到那些使用我现在拥有它的方式)
  • 我尝试使用的文件不是特定于应用程序的

标签: ios iphone uiimageview uiimage


【解决方案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 不允许您这样做。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多