首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dequeueReusableCell重叠按钮/使用带有自定义类的协议

问dequeueReusableCell重叠按钮/使用带有自定义类的协议
EN

Stack Overflow用户
提问于 2017-06-15 15:58:23
回答 1查看 46关注 0票数 0

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

cellForRowAtIndexPath的代码如下所示:

代码语言:javascript
复制
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是委托的一部分。

代码语言:javascript
复制
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

谢谢,尼克

EN

回答 1

Stack Overflow用户

发布于 2017-06-15 17:00:55

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

只需确保注册您使用的自定义单元格类:

代码语言:javascript
复制
func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44572028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档