Nano Hash - криптовалюты, майнинг, программирование

Ячейка со стеком не расширяется при отображении части стека

У меня есть контроллер представления с табличным представлением со свойством rowHeight, для которого установлено значение UITableViewAutomaticDimension:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    private var items: [String] = []

    @IBOutlet weak var tableView: UITableView!

    // MARK: - UITableViewDataSource, UITableViewDelegate

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell
        cell.expandButton.setTitle(self.items[indexPath.row], for: .normal)
        return cell
    }

    // MARK: - View cycle

    override func viewDidLoad() {
        super.viewDidLoad()

        items = [
            "Allen","Upton","Hu","Yuli","Tiger","Flynn","Lev","Kyle","Sylvester","Mohammad",
            "Harlan","Julian","Sebastian","Porter","Preston","Palmer","Jakeem","Micah","Stephen","Tucker"
        ]

        self.tableView.estimatedRowHeight = 150
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

}

Интерфейс определяется в IB следующим образом. У него есть пользовательская ячейка. Ячейка содержит представление стека. В верхней части этого стека есть кнопка, а в нижней части — текстовое поле. Текстовое поле изначально скрыто.

UITableView с ячейкой-прототипом, содержащей представление стека

Нажатие кнопки отобразит текстовое поле. Однако ячейка не расширяется:

Скриншот симулятора iOS

Ожидается, что ячейка расширится, чтобы показать весь стек. Почему это не работает?

(Я заставил его работать, перезагрузив ячейку, но это уродливый обходной путь, требующий кода в контроллере представления.)

Проект на Github: https://github.com/bvankuik/TestResizingCell


Ответы:


1

Я "исправил" проблему следующим образом. В контроллере представления я поддерживаю, скрыто или видно текстовое поле строки. Я убрал кнопку и просто использую didSelectRowAt. Это перезагружает ячейку:

struct NameCellData {
    var name: String
    var isTextFieldHidden: Bool
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    private var items: [NameCellData] = []

    @IBOutlet weak var tableView: UITableView!

    // MARK: - UITableViewDataSource, UITableViewDelegate

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell
        cell.nameLabel.text = self.items[indexPath.row].name
        cell.nameCorrectionTextField.isHidden = self.items[indexPath.row].isTextFieldHidden
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.items[indexPath.row].isTextFieldHidden = !self.items[indexPath.row].isTextFieldHidden
        tableView.reloadRows(at: [indexPath], with: .automatic)
    }

    // MARK: - View cycle

    override func viewDidLoad() {
        super.viewDidLoad()

        let names = [
            "Allen","Upton","Hu","Yuli","Tiger","Flynn","Lev","Kyle","Sylvester","Mohammad",
            "Harlan","Julian","Sebastian","Porter","Preston","Palmer","Jakeem","Micah","Stephen","Tucker"
        ]
        for name in names {
            let nameCellData = NameCellData(name: name, isTextFieldHidden: true)
            items.append(nameCellData)
        }

        self.tableView.estimatedRowHeight = 150
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

}

Полный код см. в ответвлении исходного тестового проекта на Github: https://github.com/bvankuik/TestResizingCell/tree/withReload

21.01.2017

2

К сожалению, высота ячеек с автоматическим изменением размера не изменяется автоматически при изменении в них ограничений. Когда вы создаете tableView, методы делегата вызываются: numberOfSections, numberOfRowsInSection, cellForRowAt и т.д...

Это относится и к tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath). Это означает, что если вы не перезагрузите свой tableView после изменения ограничения в ячейке, эти методы делегата не вызываются, и высота ваших строк не рассчитывается снова с помощью автоматического макета.

Лучшее предложение, которое я мог бы предложить вместо перезагрузки tableView, - это вызвать cell.layoutIfNeeded() сразу после отображения текстового поля.

20.01.2017
  • Является ли cell.layoutIfNeeded() решением? Где вы предлагаете мне поставить эту строку? 20.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..