How can I assign a different UIImage in each UITableViewCell?

五迷三道 提交于 2019-12-12 03:39:24

问题


I am struggling to figure out how exactly I can display a different image in each UITableViewCell.

I currently have a UIImageView in an expanding / collapsing UITableViewCell in my storyboard. I can assign an image to them all by defining the image in the attributes for this UIImageView but that shows the same image in each cell (obviously).

This is the code I have for TableViewController:

import UIKit

let cellID = "cell"



class TableViewController: UITableViewController {
    var selectedIndexPath : NSIndexPath?
    var tableData = ["Squats","Bench Press","Bent Over Row","Barbell Shrugs","Tricep Extensions","Straight Bar","Hyperextensions","Cable Crunches"]


    var squatImage = UIImage(named:"First.png")!
    var squatImage2 = UIImage(named:"First.png")!

    var tableImages: [UIImage] = []


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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 8
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellID, forIndexPath: indexPath) as! PickerTableViewCell

        cell.titleLabel?.text = self.tableData[indexPath.row]

//        cell.imageView?.image = self.tableImages[0]
// **This does NOT work**, it assigns a picture into each cell and on each cells title. 


        return cell
    }

    override func viewDidLoad() {
        tableImages = [squatImage,squatImage2]
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let previousIndexPath = selectedIndexPath
        if indexPath == selectedIndexPath {
            selectedIndexPath = nil
        } else {
            selectedIndexPath = indexPath
        }

        var indexPaths : Array<NSIndexPath> = []
        if let previous = previousIndexPath {
            indexPaths += [previous]
        }
        if let current = selectedIndexPath {
            indexPaths += [current]
        }
        if indexPaths.count > 0 {
            tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.Automatic)
        }
    }

    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        (cell as! PickerTableViewCell).watchFrameChanges()
    }

    override func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        (cell as! PickerTableViewCell).ignoreFrameChanges()
    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath == selectedIndexPath {
            return PickerTableViewCell.expandedHeight
        } else {
            return PickerTableViewCell.defaultHeight
        }
    }


}

and for PickerTableViewCell:

import UIKit

class PickerTableViewCell : UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    class var expandedHeight: CGFloat { get { return 200 } }
    class var defaultHeight: CGFloat  { get { return 44  } }

    @IBOutlet weak var squatImage: UIImageView!

    func checkHeight() {
        squatImage.hidden = (frame.size.height < PickerTableViewCell.expandedHeight)
    }

    func watchFrameChanges() {
        addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions.New|NSKeyValueObservingOptions.Initial, context: nil)
    }

    func ignoreFrameChanges() {
        removeObserver(self, forKeyPath: "frame")
    }

    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
        if keyPath == "frame" {
            checkHeight()
        }
    }
}

回答1:


try this one

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        ...
        cell.titleLabel?.text = self.tableData[indexPath.row]

        cell.imageView?.image = self.tableImages[indexPath.row % 2] 
        return cell
}


来源:https://stackoverflow.com/questions/31557420/how-can-i-assign-a-different-uiimage-in-each-uitableviewcell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!