【问题标题】:How to use UIImage in swift 3 the array comes nil?如何在 swift 3 中使用 UIImage 数组为零?
【发布时间】:2017-08-10 12:23:39
【问题描述】:

我有一组 png 图片。

iconeImage = [UIImage(named:"ion-home")!,UIImage(named:"ms-medkit")!,UIImage(named:"ion-edit")!,UIImage(named:"ion-clipboard")!,UIImage(named:"ion-clipboard")!,UIImage(named:"ion-waterdrop")!,UIImage(named:"ion-calendar")!]

我有一个用于表格视图的函数,它用这个数组元素设置图像

这里是代码

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MenuTableViewCell") as! MenuTableViewCell
        cell.imgIcon.image = iconeImage[indexPath.row]
        return cell
    }

但它给了我 iconeImage 具有 nil 值的错误。所以你能建议我解决方案吗?我是 swift 3 的初学者

这是截图 ![两个布偶][1]

【问题讨论】:

  • 您的项目中真的有一张名为ion-home 的图片吗?每个都一样?
  • 看起来您实际上没有与所有这些图像名称匹配的图像,或者您可能没有将它们存储在正确的位置。除非它们是 Assets.xcassets 的一部分,否则您还需要在图像名称中指定扩展名。
  • 如果它说iconeImagenil,或者它有0图像,这意味着上面的代码从未执行过,或者内容被替换了其他部分.另一方面,如果其中一个图像 init 应该返回 nil,则应用程序会崩溃,说您有一个意外的 nil(因为强制展开“!”)。
  • 是的,我的 Assets.xcassets 文件夹中有这些图像
  • 只是为了建议:为什么不使用图像数组而不是使用图像名称数组?

标签: ios swift swift3 uiimage


【解决方案1】:

我建议您存储图像名称,而不是将所有图像保存在内存中:

let iconImages = ["ion-home", "ms-medkit", "ion-edit", "ion-clipboard", "ion-waterdrop", "ion-calendar"]

并在需要时直接预加载每个图像。它不会影响性能,因为它是小图标。代码也会看起来更干净。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MenuTableViewCell") as! MenuTableViewCell
    cell.imgIcon.image = UIImage(named: iconImages[indexPath.row])
    return cell
}

仔细检查所有资产是否都已添加到您的项目中。如果它们在那里,则应显示图像。

尽量避免在代码中使用隐式展开的可选 (!)。 Nil 值会使应用程序崩溃。在您的示例中, imageView.image 是可选的,因此您可以将 UIImage(named: "imageName") 设置为它。

另外,您可以尝试清理构建文件夹、清理项目并重新安装应用程序。有时在 Xcode 中复制资源会失败。

【讨论】:

  • 检查是否将 Assets.xcassets 添加到您的目标中。打开资产文件,在右侧菜单中点击 1 个选项卡。检查目标会员部分,目标名称附近应该有复选标记
【解决方案2】:

请尝试以下格式

  let img = iconeImage[indexPath.row]
    if let imgData = img {
        cell.imgView.image = UIImage(data:imgData)
    }

【讨论】:

    【解决方案3】:

    您可以改为存储图像名称:

    let iconImageNames = ["ion-home","ms-medkit", ... , "ion-calendar")]
    

    稍后在您的方法中访问它们:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MenuTableViewCell") as! MenuTableViewCell
        let name = iconeImage[indexPath.row] ?? yourDefaultImageName
        cell.imgIcon.image = UIImage(named: name)
        return cell
    }
    

    举个例子

    【讨论】:

    • @sanjayrathod,告诉我你的 iconImage 是如何定义的
    • iconeImage = ["ion-home","ms-medkit","ion-edit","ion-clipboard","ion-clipboard","ion-waterdrop","ion-日历"]
    • @sanjayrathod。这不是一个定义;它的设置。你的 iconImage 是在哪里定义的?
    • var iconeImage:Array = [String]()
    • @sanjayrathod,你现在的错误在哪里?如果您使用的是字符串数组
    【解决方案4】:

    我不知道到底是什么问题。

    但是当我在 stackoverflow 上进行搜索时。在某处我读到 Assets.xcassets 有问题

    然后我得到了this的错误

    然后借助该答案解决错误。

    希望我解决了这个错误。

    同时问题在于资产文件夹。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多