我有UITableView,有2个扩展的部分。 因此,当我点击部分标题时,行将被隐藏:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
print("Section: \(indexPath.section), Row \(indexPath.row), \(sections[indexPath.section].expanded)")
if sections[indexPath.section].expanded {
return 88
} else {
return 0
}
}
我正在向UITableView中的单元格添加UIlabel,如下所示:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
let label = UILabel()
cell.contentView.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.leftAnchor.constraint(equalTo: cell.leftAnchor).isActive = true
label.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
label.widthAnchor.constraint(equalTo: cell.widthAnchor).isActive = true
label.heightAnchor.constraint(equalToConstant: 30).isActive = true
label.text = "row = \(indexPath.row)"
return cell
}
上面的工作正常,但是单元格没有正确显示屏幕,row1的内容会打印在另一行。
如果我添加以下代码,当我点击任何部分的标题时,行将在tableView上正确显示,但只是一次,我的意思是如果我再次单击标题,则出现错误发生在CellForRowAt函数内部(线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)):
cell.contentView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
有任何建议吗?
编辑: 为了解释这些部分是如何扩展的,我将添加以下内容:
protocol ExpandableHeaderViewDelegate {
func toggleSection(header: ExpandableHeaderView, section: Int)
}
class ExpandableHeaderView: UITableViewHeaderFooterView {
var delegate: ExpandableHeaderViewDelegate?
var section: Int!
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectHeaderAction)))
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func selectHeaderAction(gestureRecognizer: UITapGestureRecognizer) {
let cell = gestureRecognizer.view as! ExpandableHeaderView
delegate?.toggleSection(header: self, section: cell.section)
}
func toggleSection(header: ExpandableHeaderView, section: Int) {
tableView.beginUpdates()
tableView.endUpdates()
}
}
答案 0 :(得分:0)
如果问题仅在于细胞数据不匹配,请尝试使用
override func prepareForReuse() {
super.prepareForReuse()
self.label.text = ""
}
使用null值在单元格的类中声明UILabel,而不是在cellForRowAt
答案 1 :(得分:0)
在cellForRowAt中尝试:
if tableView.rectForRow(at: indexPath).height == 0.0 {
return UITableViewCell()
}
它应该高于所有其他代码。
答案 2 :(得分:0)
尝试(在添加新标签之前调用它)
cell.contentView.subviews.removeAll()
而不是
cell.contentView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
答案 3 :(得分:0)
我的问题由[Knight0fDragon]解决。
0
然后
$location = array();
$name = array();
foreach( $entities->results as $key => $value ) {
if( stristr($value->vicinity, $key_stroke) ) {
$location[] = array(
'place_id' => $value->place_id,
'vicinity' => $value->vicinity,
);
}
if( stristr($value->name, $key_stroke) ) {
$name[] = array(
'place_id' => $value->place_id,
'name' => $value->name,
);
}
}
感谢所有善良的人们的支持。