如何在 swift 3 中使用 UIImage 数组为零?

Posted

技术标签:

【中文标题】如何在 swift 3 中使用 UIImage 数组为零?【英文标题】:How to use UIImage in swift 3 the array comes nil? 【发布时间】: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 文件夹中有这些图像 只是为了建议:为什么不使用图像数组而不是使用图像名称数组? 【参考方案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】:

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

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

然后我得到了this的错误

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

希望我解决了这个错误。

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

【讨论】:

以上是关于如何在 swift 3 中使用 UIImage 数组为零?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 获取 UIImage 中像素的颜色?

无法在 Swift 中使用时间延迟为 UIImage 设置动画

将一张图像分成多个部分后,如何在 Swift 中使用 UIImage 数组?

如何在Swift中优雅地使用UIImage

如何在 Swift 中识别 UIImage 数组中的 Tapped UIImage

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中