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

Posted

技术标签:

【中文标题】如何将 Images.xcassets 中的图像加载到 UIImage 中【英文标题】:How to load images from Images.xcassets into a UIImage 【发布时间】:2016-04-19 01:45:29 【问题描述】:

我正在尝试将图像编码为 UIImage,但我遇到了问题。我不确定如何为每个列表项的每个不同图像编码。我正在构建的应用是一个列表,每个列表项都附有图片。

下面是 MyWhatsit 类:

class MyWhatsit 

var name: String 
    didSet 
        postDidChangeNotification()
    

var location: String 
    didSet 
        postDidChangeNotification()
    

var image: UIImage? 
    didSet 
        postDidChangeNotification()
    

var viewImage: UIImage 
    return image ?? UIImage(named: "camera")!


init( name: String, position: String = "" ) 
    self.name = name
    self.location = location


func postDidChangeNotification() 
    let center = NSNotificationCenter.defaultCenter()
    center.postNotificationName(WhatsitDidChangeNotification, object: self)



下面是表格视图:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 1


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return things.count


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    let thing = things[indexPath.row] as MyWhatsit
    cell.textLabel?.text = thing.name
    cell.detailTextLabel?.text = thing.location
    cell.imageView?.image = thing.viewImage
    return cell


override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 
    // Return false if you do not want the specified item to be editable.
    return true


override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
    if editingStyle == .Delete 
        things.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
     else if editingStyle == .Insert 
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    

【问题讨论】:

请不要破坏您的帖子。 我想删除我的帖子。 @DavidSmith 您可以在您的问题上举起版主标志以提醒版主。但破坏它不是解决方案。写下你为什么要在标志内删除你的帖子。 @DavidSmith 现在你又破坏了它,一个自动标记已经升起,版主很快就会来查看你的情况。同时,请停止删除您帖子的所有内容。 【参考方案1】:

我相信您需要做的就是创建一组图像,就像您使用标题和副标题一样。添加另一张图片时,将图像名称添加到数组并附加 tableView。

我在您的代码中看到的是名称和职位。看起来您需要添加“图像”并将其设置为图像的名称。例如,MyWhatsit(name: "Bob Smith", position: "midfielder", image: "bobSmithImage")... 然后将单元格的图像视图设置为与图像名称相同。

希望这能让你感动!

【讨论】:

感谢您的反馈。我添加了一些代码。 没问题!我在您的代码中看到的是名称和职位。看起来您需要添加“图像”并将其设置为图像的名称。例如,MyWhatsit(name: "Bob Smith", position: "midfielder", image: "bobSmithImage") ...然后将单元格的图像视图设置为与图像名称相同。 我收到与图像名称相同的图像视图错误。你能给我一个示例代码吗? 你能告诉我你使用了什么代码以及 Xcode 给你的错误吗?【参考方案2】:

您需要创建自己的个人类别。例如,根据玩家的位置对玩家进行排序。使用将图像存储到数组中的类。例如:

let goalkeeper = [UIImage(named:"ivanlucic"), UIImage(named:"manuelneuer")]
let rightBack = [UIImage(named:"danialves"), UIImage(named:"sergioramos")]

获得图像列表后,您可以在 cellForRowAtIndexPath 中进行检查,并将其引用到您创建的数组。

【讨论】:

感谢您的建议。我添加了一些代码,它会改变你的建议吗? 结构由您决定。你也可以这样做,但是我建议你把你的图片文件名改成和那个播放器的名字一样,这样在引用的时候就可以少写代码了。【参考方案3】:

不明白你是如何在表格视图中设置代码的,但你可以添加像

这样的名称的图像名称

其中 image 键包含您存储在 XCAssets 中的图像名称

var things: [MyWhatsit] = [
    MyWhatsit(name: "Ivan Lucic", position: "Goalkeeper","image":"ivan"),
    MyWhatsit(name: "Manuel Neuer", position: "Goalkeeper","image":"manuel")...]

而且你可以在初始化名字的同时初始化图片

init( name: String, position: String = "", imagename:string ) 
    self.name = name
    self.position = position
    self.imgview = UIImage(named:imagename)

【讨论】:

谢谢。我添加了表格视图代码。这会改变你推荐的代码吗?

以上是关于如何将 Images.xcassets 中的图像加载到 UIImage 中的主要内容,如果未能解决你的问题,请参考以下文章

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

如何本地化 Images.xcassets 中的图像?

从Images.xcassets加载图像

在 Storyboard 的 UIImageView 中使用 Images.xcassets 中的启动图像?

在 iOS 中以编程方式将图像集添加到 images.xcassets 目录?

如何获得images.xcassets 中图片的路径?