我正在进行一个使用表视图控制器的项目。在每个表视图单元格中,都有一个UILabel和一个自定义分段控件。我已经构建了自定义分段控件以及UILabel中的cellForRowAtIndexPath。不幸的是,由于单元重用,新的分段控件和UILabels被创建在先前存在的控件之上,导致每个单元中有多个重叠的分段控件和UILabels。显然,这是一个严重的内存问题,最终会导致应用程序崩溃。
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
谢谢,尼克
发布于 2017-06-15 17:00:55
我认为知道是否创建新标签和分段视图的最简单方法是拥有一个子类,该子类仅指定是否使用"var viewsAdded = false“之类的布尔值绘制单元格。
只需确保注册您使用的自定义单元格类:
func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)https://developer.apple.com/documentation/uikit/uitableview/1614888-register
https://stackoverflow.com/questions/44572028
复制相似问题