我想知道我们是否可以创建一个动态函数来访问动态的单元格模板(xib模板),如下所示:
func create_image(TemplateName:??? = TemplateCell) {
var cell = self.tableView.cellForRow(at: currindexpath as IndexPath) as! TemplateName
}
我想传递" TemplateName"使用UITableViewCell类的名称:
class template1: UITableViewCell {
}
所以在那个参数上我可以传递我制作的任何模板单元格。那可能吗?对不起,如果难以解释。
答案 0 :(得分:1)
总之:不。斯威夫特并不像你想要的那样充满活力。在as!
之后唯一可以追求的是实际的文字类型名称 - 而不是对您在变量或参数中传递的类型的某种引用。
作为替代方案,您可以将单元格出列,然后询问单元格的类型,从而安全明确地输出:
let cell = // ... dequeue the cell as a UITableViewCell
if let cell = cell as? MyTableViewCell {
// here, cell is a MyTableViewCell now
}
使用switch语句而不是if
,可以为所有不同的单元子类做到这一点。
答案 1 :(得分:1)
I have done this in one my sample project: Here is the sample code-
func setCardLayoutAccordingToId(cell: UITableViewCell,layoutId:Int) -> UITableViewCell {
let cgRect: CGRect = cell.contentView.frame
var layoutView: Any = DefaultCardView(frame: cgRect)
switch layoutId {
case 1:
layoutView = DefaultCardView(frame:cgRect)
case 2:
layoutView = Template_1(frame:cgRect)
case 3:
layoutView = Template_2(frame:cgRect)
case 4:
layoutView = Template_3(frame:cgRect)
default:
layoutView = DefaultCardView(frame:cgRect)
(layoutView as! DefaultCardView).setData(cardData: data)
}
for view in (cell.contentView.subviews)!{
view.removeFromSuperview()
}
cell.contentView.viewWithTag(1)?.addSubview(layoutView as! UIView)
(layoutView as! UIView).translatesAutoresizingMaskIntoConstraints = false
let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left]
NSLayoutConstraint.activate(attributes.map {
NSLayoutConstraint(item: (layoutView as! UIView), attribute: $0, relatedBy: .equal, toItem: (layoutView as! UIView).superview, attribute: $0, multiplier: 1, constant: 0)})
return cell }
P.S:layout_Id可以根据您的需要决定。
答案 2 :(得分:0)
您确实可以在函数中传递TemplateCell
。例如:
func yourMethodForCell(_ cell: TemplateCell){
cell.backgroundColor = .red
}
然后打电话如下:
yourMethodForCell(cell)