UITableViewCellの拡張について質問があります。
「もっと見る」というタイトルのUIButtonをクリックすると、正常に展開されます。
次に、UITableViewをスクロールすると、クリックしていないもう1つのセルである状況が表示されます。UIButtonも展開されます。
この問題を解決するための良いアイデアはありますか?
ありがとう。
class ViewController: UIViewController {
let tableView = UITableView()
let cellWithButton = "cellWithButton"
var isExpand: Bool = false
var expandIndexs: [IndexPath] = []
let text = "If you read and listen to two articles every day, your reading and listening skills can immm If you read and listen to two articles every day, your reading and listening skills can immm If you read and listen to two articles every day, your reading and listening skills can immm If you read and listen to two articles every day, your reading and listening skills can immm If you read and listen to two articles every day, your reading and listening skills can immm"
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.allowsSelection = false
tableView.separatorInset = .zero
tableView.estimatedRowHeight = 44
tableView.rowHeight = UITableViewAutomaticDimension
tableView.register(WithButtonTableViewCell.self, forCellReuseIdentifier: cellWithButton)
self.view.addSubview(tableView)
tableView.snp.makeConstraints { (make) in
make.top.left.right.bottom.equalToSuperview()
}
}
@objc func btnPressed(sender: UIButton) {
let indexPath = IndexPath(row: sender.tag, section: 0)
if self.isExpand == false {
self.isExpand = true
self.expandIndexs.append(indexPath)
} else {
self.isExpand = false
let index = self.expandIndexs.index(of: indexPath)
if let index = index {
self.expandIndexs.remove(at: index)
}
}
tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .none)
tableView.endUpdates()
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellWithButton, for: indexPath) as! WithButtonTableViewCell
if self.expandIndexs.contains(indexPath) {
cell.cellIsExpand = self.isExpand
}
cell.titleLabel.text = text
cell.expandButton.addTarget(self, action: #selector(btnPressed), for: .touchUpInside)
cell.expandButton.tag = indexPath.row
cell.layoutIfNeeded()
return cell
}
}
class WithButtonTableViewCell: UITableViewCell {
var cellIsExpand: Bool = false
let titleLabel: UILabel = { () -> UILabel in
let ui = UILabel()
ui.textColor = UIColor.black
return ui
}()
let expandButton: UIButton = { () -> UIButton in
let ui = UIButton()
ui.setTitleColor(UIColor.blue, for: .normal)
return ui
}()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
loadUI()
loadLayout()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutIfNeeded() {
super.layoutIfNeeded()
if cellIsExpand == true {
titleLabel.numberOfLines = 0
expandButton.setTitle("Close.", for: .normal)
}else{
titleLabel.numberOfLines = 2
expandButton.setTitle("Show More.", for: .normal)
}
}
func loadUI() {
self.addSubview(titleLabel)
self.addSubview(expandButton)
}
func loadLayout() {
titleLabel.snp.makeConstraints { (make) in
make.top.left.equalTo(15)
make.right.equalTo(-15)
}
expandButton.snp.makeConstraints { (make) in
make.top.equalTo(titleLabel.snp.bottom).offset(10)
make.left.equalTo(10)
make.right.equalTo(-15)
make.bottom.equalTo(-15)
}
}
}
isExpandのブール値の配列が必要です。また、cellForRowで、それが実際に行の高さを変更しているかどうかを確認してください。
まず最初に配列を作成します:
var expandingStateArray = [false,false,false,false,false,false,false,false,false,false]
次に、cellForRowsで各セルの状態を確認します。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellWithButton, for: indexPath) as! WithButtonTableViewCell
if expandingStateArray[indexPath.row] {
titleLabel.numberOfLines = 0
expandButton.setTitle("Close.", for: .normal)
}else{
titleLabel.numberOfLines = 2
expandButton.setTitle("Show More.", for: .normal)
}
cell.titleLabel.text = text
cell.expandButton.addTarget(self, action: #selector(btnPressed), for: .touchUpInside)
cell.expandButton.tag = indexPath.row
cell.layoutIfNeeded()
return cell
}
}
そして、ボタンのターゲットメソッドでこれを書いてください:
@objc func btnPressed(sender: UIButton) {
let indexPath = IndexPath(row: sender.tag, section: 0)
expandingStateArray[sender.tag] = !expandingStateArray[sender.tag]
tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .none)
tableView.endUpdates()
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加