Расширение ячейки просмотра таблицы при нажатии кнопки требует 2 касания

Что я хочу

У меня есть UITableView с XIB-CustomCell, содержащий 2 представления:

  • fooView содержит несколько ярлыков и кнопок
  • mapView содержит MKMapView

Когда я нажимаю кнопку fooView, я хочу показать / скрыть mapView под fooView


Моя проблема

Когда я нажимаю кнопку fooView для переключения mapView, мне нужно нажать ее несколько раз, чтобы развернуть / свернуть мою ячейку.

  1. Пресса: ничего не происходит
  2. Пресса: расширяет ячейку, как и ожидалось
  3. Нажмите Это перезагрузит карту
  4. Нажмите Это разрушает ячейку, как и ожидалось

Для расширения ячейки я использую этот код:

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()
    }
}

Картина

первая ячейка расширена

0 ответов

Другие вопросы по тегам