dequeueReusableCell重叠按钮/使用自定义类的协议

时间:2017-06-15 15:58:24

标签: ios swift uitableview delegates cell

我正在开发一个使用表视图控制器的项目。在每个表视图单元格中,有一个UILabel和一个自定义分段控件。我已经构建了自定义分段控件以及cellForRowAtIndexPath中的UILabel。不幸的是,由于细胞重用,新的分段控制和UILabel是在预先存在的控制和UILabel上创建的,导致每个细胞中有多个重叠的分段控制和UILabel。显然,这是一个重要的内存问题,最终导致应用程序崩溃。

cellForRowAtIndexPath的代码如下所示:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)


    let nameLabel: UILabel = {
        let label = UILabel()
        label.text = "Sample Item"
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    let actionButton = YSSegmentedControl(
        frame: CGRect.zero,
        titles: [
            "No",
            "Yes"
        ])

最可行的解决方案是创建自定义单元类,然后在其中创建分段控件和UILabel。但是,由于分段控件是自定义的并且使用委托在其代码和TableViewController之间交换信息这一事实,我遇到了困难。委托应该访问自定义单元格类并输出分段控件的选定索引(即" 0"对于选项0和" 1"对于选项1)但是我无法得到这个上班。

以下是我尝试用来创建自定义单元格类的代码(其中MyCell是自定义类,extension MyCell是委托的一部分。

class MyCell: UITableViewCell{


override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    setupViews()

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}


let nameLabel: UILabel = {
    let label = UILabel()
    label.text = "Sample Item"
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

let actionButton = YSSegmentedControl(
    frame: CGRect.zero,
    titles: [
        "Yes",
        "No"
    ])

func setupViews(){


    addSubview(nameLabel)
    addSubview(actionButton)
    actionButton.translatesAutoresizingMaskIntoConstraints = false

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-160-[v1]-16-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel, "v1": actionButton]));
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": nameLabel]))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[v0]-60-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": actionButton]))

}
}

var tagToIndex = [1:0,2:0,3:0,4:0,5:0]

extension MyCell: YSSegmentedControlDelegate {
func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) {
    print(index)
}

func segmentedControl(_ segmentedControl: YSSegmentedControl, didPressItemAt index: Int) {

}

}

其他信息

我必须有办法处理分段控件所在的单元格的索引。目前,每个分段控件都附加了一个与该行对应的标记。如果有人有任何建议,我愿意接触其他方式访问行索引(即通过授权)。

这里是应用程序的图片,只是为了让事情更清晰

https://i.stack.imgur.com/ezMUJ.png

谢谢, 尼克

1 个答案:

答案 0 :(得分:0)

我认为,知道是否创建新标签和分段视图的最简单方法是使用一个子类,该子类仅指定是否使用类似“var viewsAdded = false”的布尔值绘制了单元格。

只需确保使用以下命令注册自定义单元格类:

func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

https://developer.apple.com/documentation/uikit/uitableview/1614888-register