Ios 显示单元格数组中的自定义UITableViewCell
我有一个Ios 显示单元格数组中的自定义UITableViewCell,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个UIViewController,它创建一个自定义的UITableViewCell,并将其插入数组中。然后我有一个UITableViewController,我想显示上一个数组中的单元格。问题是在tableView(tableView:cellforrowatinexpath)中,我不想使用dequeueReusableCellWithIdentifier,因为我只想从数组中获取单元格并使用它们 不幸的是,这不起作用。我读取dequeueReusableCellWithIdentifie
UIViewController
,它创建一个自定义的UITableViewCell
,并将其插入数组中。然后我有一个UITableViewController
,我想显示上一个数组中的单元格。问题是在tableView(tableView:cellforrowatinexpath)
中,我不想使用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
中的单元格出列,并在那里进行设置。如果无法检索信息来填充CellForRowatineXpath
中的单元格,请创建一个类或对象来保存单元格标识符以及填充单元格所需的所有信息(标签文本、图像视图的图像文件名等)
请记住,表视图单元格是视图对象,不应在视图对象中包含逻辑。将所有逻辑放在一个单独的对象中,然后根据需要填充单元格。不要混淆单元格和数据模型。您没有理由不能使用标准的单元出列方法。谢谢您的帮助。我解决了我的问题:我做了一个带有两个标签和进度视图的自定义
UIView
,并创建了一个xib文件,在其中我用约束绘制了这些东西。然后,我在自定义视图中加载了xib,最后使用addSubview()
将其添加到我的UITableViewCell
中。