我正在开发一个使用表视图控制器的项目。在每个表视图单元格中,有一个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
谢谢, 尼克
答案 0 :(得分:0)
我认为,知道是否创建新标签和分段视图的最简单方法是使用一个子类,该子类仅指定是否使用类似“var viewsAdded = false”的布尔值绘制了单元格。
只需确保使用以下命令注册自定义单元格类:
func register(_ cellClass: AnyClass?, forCellReuseIdentifier identifier: String)
https://developer.apple.com/documentation/uikit/uitableview/1614888-register