[英]Display custom UITableViewCell from an array of cells
我有一个UIViewController
,它创建一个自定义UITableViewCell
并将其插入到数组中。 然后,我有一个UITableViewController
,我想显示上一个数组中的单元格。 问题是在tableView(tableView:cellForRowAtIndexPath)
我不想使用dequeueReusableCellWithIdentifier
因为我只想从数组中获取单元格并使用它们。
不幸的是,这不起作用。 我阅读了dequeueReusableCellWithIdentifier
允许仅将必要的单元格保存在内存中。
我正在考虑一种将“自定义”单元格“推送”到该队列中的方法,但找不到任何东西。 因此,最后我无法显示我的自定义单元格。
注意:我无法使用dequeueReusableCellWithIdentifier
获得单元格,也无法设置每个属性,因为其中一个是UIProgressView
并且在我的自定义单元格类中进行了更新,因此我需要显示该单元格。
这是UIViewController
的代码,用于创建自定义单元并将其设置为数组:
//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)
这是我的自定义单元格:
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
...
}
最后,这是我的自定义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]
}
}
而不是将UITableViewCells
添加到数组中,您可能应该仅添加单元格标识符,然后使cellForRowAtIndexPath
的单元格出队并在那里进行设置。 如果您无法检索信息来填充cellForRowAtIndexPath
的单元格,则创建一个类或对象来保存单元格标识符以及所有需要填充单元格的信息(标签文本,图像文件名,图像视图等)。 )。
请记住,表视图单元格是视图对象,并且不应在视图对象中包含逻辑。 将所有逻辑放入单独的对象中,然后根据需要填充单元格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.