简体   繁体   中英

Display custom UITableViewCell from an array of cells

I have an UIViewController that creates a custom UITableViewCell and insert it into an array. Then I've a UITableViewController and I want to show cells from previous array. The problem is that in tableView(tableView:cellForRowAtIndexPath) I don't want to use dequeueReusableCellWithIdentifier because I just want to get the cells from the array and use them.

Unfortunately this doesn't work. I read dequeueReusableCellWithIdentifier permits to save in memory only the necessary cells.

I'm thinking about a method to "push" my custom cells in that queue but I can't find anything. So at the end I'm not able to show my custom cells.

Note: I can't obtain the cell using dequeueReusableCellWithIdentifier and than set each properties because one of them is a UIProgressView and it's updated within my custom cell class so I need to display that cell.

This is the code within the UIViewController which create the custom cell and set it into the array:

//here I create my custom cell (DownloadTVCell)
let cell = DownloadTVCell(style: UITableViewCellStyle.Default, reuseIdentifier: "DownloadRootTVC_IDcell")

cell.nomeFileInDownloadLabel.text = nomeCompletoMp3
//this is a method in DownloadTVCell that starts a download task
cell.createDownloadTask()

//here i got the navigationController in order to obtain the instance of 
//the UITableViewController. In this method when a user tap on the
//UITableViewController it's already instantiated
let nc = self.tabBarController!.viewControllers![1] as! UINavigationController
let drtvc = nc.topViewController as! DownloadRootTVC

//now drtvc is the instance of DOwnloadRootTVC which is my custom UITableViewController
//add the cell to the array
drtvc.listOfCellsDownlaod.append(cell)

This is my custom cell:

class DownloadTVCell: MGSwipeTableCell, NSURLSessionDownloadDelegate {

//******************************************************************
//      IBOUtlet
//******************************************************************
@IBOutlet var nomeFileInDownloadLabel: UILabel!

@IBOutlet var quantitaScaricataLabel: UILabel!

@IBOutlet var progressView: UIProgressView!


private var downloadTask: NSURLSessionDownloadTask?

//******************************************************************
//      METODI
//******************************************************************


override init(style: UITableViewCellStyle, reuseIdentifier: String?) {

    super.init(style: style, reuseIdentifier: reuseIdentifier)
    log("ACTION", text: "Metodo chiamato")
    build()
}

required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)
    log("ACTION", text: "Metodo chiamato")

    build()
}



override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

private func build() {
    self.nomeFileInDownloadLabel = UILabel()
    self.quantitaScaricataLabel = UILabel()
    self.progressView = UIProgressView()
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

//here there is some logic for download
...
}

And finally this is my custom UITableView:

class DownloadRootTVC: UITableViewController {

//******************************************************************
//      PROPRIETA' GENERICHE
//******************************************************************
var listOfCellsDownlaod = [DownloadTVCell]()

//******************************************************************
//      METODI
//******************************************************************
override func viewDidLoad() {
    log(text: "self.listOfCellsDownlaod.count: \(self.listOfCellsDownlaod.count)")

    self.tableView.delegate = self
    self.tableView.dataSource = self

    self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "reloadTableData:", name: "reload", object: nil)

    //self.tableView.registerClass(DownloadTVCell.self, forCellReuseIdentifier: "DownloadRootTVC_IDcell")

    super.viewDidLoad()
}

func refresh(sender:AnyObject) {
    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}

func reloadTableData(notification: NSNotification) {
    tableView.reloadData()
}

override func viewDidAppear(animated: Bool) {
    self.tableView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.listOfCellsDownlaod.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
   //let cell = tableView.dequeueReusableCellWithIdentifier("DownloadRootTVC_IDcell", forIndexPath: indexPath) as! DownloadTVCell

    //I just want to return my custom cell
    return self.listOfCellsDownlaod[indexPath.row]
}

}

Instead of adding UITableViewCells to your array you should probably add only the cell identifiers and then dequeue the cells in cellForRowAtIndexPath and do the set up there. If you can't retrieve the information to populate the cells in cellForRowAtIndexPath , then create a class or object to save the cell identifiers together with all the info you need to populate the cells (texts for labels, image file names for image views, etc).

Remember that table view cells are view objects and you should not include logic in view objects. Put all the logic into a separate object and then just fill the cells as needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM