[UITableViewCell]
你好。请想象上面的层次结构。在我的代码中,我没有类型完全为genericCell
的对象,但是此类共享一些属性。
我的代码应具有什么init设计?我对genericCell具有以下结构:
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//my stuff (initializing shared properties)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
但是
Cell1
呢?如何通过初始化init(style: UITableViewCellStyle, reuseIdentifier: String?)
实例在genericCell
中为“我的东西”操作调用Cell1
?现在他们不执行了。编辑
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let typeOfCell = FbDataManager.sharedInstance.posts[indexPath.row][FbDataManager.sharedInstance.typeParameter] as! String
switch typeOfCell {
case self.linkTypeOfPost:
var cell = tableView.dequeueReusableCellWithIdentifier(self.linkCellIdentifier) as? FbLinkPostViewCell
if cell == nil {
cell = FbLinkPostViewCell.init(style: .Default, reuseIdentifier: self.linkCellIdentifier)
}
//...
你好,我们又见面了。这是来自tableView的委托(delegate)的一部分,顺便说一句,我将Abhinav的init复制粘贴到了我的代码中,但是这些init仍然无法正常工作。 (无输出到控制台)
最佳答案
我不确定我是否正确理解了您的问题,但这似乎与类之间的继承有关。因此,基本上,您有一个继承自“UITableViewCell”的“GenericCell”类,以及分别继承自“GenericCell”的“CellOne”,“CellTwo”和“CellThree”类。如果要通过样式进行初始化,则设置方法如下:
class GenericCell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// code common to all your cells goes here
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
class CellOne: GenericCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier) // the common code is executed in this super call
// code unique to CellOne goes here
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
然后,您可以在表 View 的数据源中创建CellOne的实例,如下所示:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cell")
if (cell == nil) {
cell = CellOne.init(style: .Default, reuseIdentifier: "cell")
}
return cell!
}
对于每个实例,现在将首先通过“GenericCell”完成通用设置,然后通过“CellOne”进行唯一设置。相应地将设置“CellTwo”和“CellThree”。
编辑
有关如何配置所有三种单元类型的实例的更具体的示例:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// you need to write a method like this to figure out which type you need:
let cellID = self.cellIDForIndexPath(indexPath) // returns either "cell1", "cell2" or "cell3"
// dequeue or init a cell of the approriate type
var cell = tableView.dequeueReusableCellWithIdentifier(cellID)
if (cell == nil) {
switch cellID {
case "cell1": cell = CellOne.init(style: .Default, reuseIdentifier: "cell")
case "cell2": cell = CellTwo.init(style: .Default, reuseIdentifier: "cell")
case "cell3": cell = CellThree.init(style: .Default, reuseIdentifier: "cell")
default: cell = UITableViewCell()
}
}
// configure the individual cell if needed (you need to implement methods + logic here that fit your data)
(cell as! GenericCell).configureForData(self.dataForIndexPath(indexPath))
return cell!
}