Расширение ячейки просмотра таблицы при нажатии кнопки требует 2 касания
Что я хочу
У меня есть UITableView с XIB-CustomCell, содержащий 2 представления:
- fooView содержит несколько ярлыков и кнопок
- mapView содержит MKMapView
Когда я нажимаю кнопку fooView, я хочу показать / скрыть mapView под fooView
Моя проблема
Когда я нажимаю кнопку fooView для переключения mapView, мне нужно нажать ее несколько раз, чтобы развернуть / свернуть мою ячейку.
- Пресса: ничего не происходит
- Пресса: расширяет ячейку, как и ожидалось
- Нажмите Это перезагрузит карту
- Нажмите Это разрушает ячейку, как и ожидалось
Для расширения ячейки я использую этот код:
fileprivate func toggleMap() {
if state == .defaultState {
mapHeightConstraint.priority = UILayoutPriority(999)
state = .mapState
}
else {
mapHeightConstraint.priority = UILayoutPriority(250)
state = .defaultState
}
delegate.updateTable(index)
}
делегат - это ViewController, содержащий tableView (DashboardViewController)
updateTable (index) является функцией ViewController
func updateTable(_ index: IndexPath) {
tableView.beginUpdates()
tableView.reloadRows(at: [index], with: .automatic)
tableView.endUpdates()
}
Полный код
Это мой кастом
import UIKit
import MapKit
@IBDesignable
class TripCell: UITableViewCell {
// MARK: - Cell State
enum CellState {
case defaultState
case mapState
}
// MARK: - Delegate Stuff for reloading
var state: CellState = .defaultState
var delegate: DashboardViewController!
var index: IndexPath!
// MARK: - IBOutlets
@IBOutlet weak var mapState: UIView!
// mapStateHeightConstraint: (constant: 0, priority 750)
@IBOutlet weak var mapStateHeightConstraint: NSLayoutConstraint!
// mapHeightConstraint: (constant: 100, priority: 250)
@IBOutlet weak var mapHeightConstraint: NSLayoutConstraint!
// Label
@IBOutlet weak var origin: UILabel!
// Button
@IBOutlet weak var showOnMap: UIButton!
// MARK: - IBAction
@IBAction func showOnMapPressed(_ sender: UIButton) {
toggleMap()
}
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
}
}
extension TripCell {
fileprivate func toggleMap() {
if state == .defaultState {
mapHeightConstraint.priority = UILayoutPriority(999)
state = .mapState
}
else {
mapHeightConstraint.priority = UILayoutPriority(250)
state = .defaultState
}
delegate.updateTable(index)
}
}
Это расширение DashboardViewController
extension DashboardViewController: UITableViewDelegate, UITableViewDataSource {
internal func setupTableView() {
tableView.register(UINib(nibName: "TripCell", bundle: nil), forCellReuseIdentifier: "TripCellID")
tableView.delegate = self
tableView.dataSource = self
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = UITableView.automaticDimension
// tableView.allowsMultipleSelection = true
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TripCellID", for: indexPath) as! TripCell
TripFunctions.readTrips {
cell.origin.text = Data.trips[indexPath.row].title
}
// for reloading row
cell.delegate = self
cell.index = indexPath
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// if let selectedIndexPaths = tableView.indexPathsForSelectedRows, selectedIndexPaths.contains(indexPath) {
// return 220
// }
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
updateTable(indexPath)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
updateTable(indexPath)
}
func updateTable(_ index: IndexPath) {
tableView.beginUpdates()
tableView.reloadRows(at: [index], with: .automatic)
tableView.endUpdates()
}
}