如何使用UITableViewCell作为参数创建一个函数?

时间:2017-11-23 04:13:55

标签: ios swift uitableview

我想知道我们是否可以创建一个动态函数来访问动态的单元格模板(xib模板),如下所示:

func create_image(TemplateName:??? = TemplateCell) {
    var cell = self.tableView.cellForRow(at: currindexpath as IndexPath) as! TemplateName
}

我想传递" TemplateName"使用UITableViewCell类的名称:

class template1: UITableViewCell {
}

所以在那个参数上我可以传递我制作的任何模板单元格。那可能吗?对不起,如果难以解释。

3 个答案:

答案 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)