如何在 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
的一部分,否则您还需要在图像名称中指定扩展名。
如果它说iconeImage
是nil
,或者它有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 数组?